@openfeature/web-sdk 0.3.3-experimental → 0.3.5-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/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  [![Project Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public.](https://www.repostatus.org/badges/latest/wip.svg)](https://www.repostatus.org/#wip)
13
13
  [![npm version](https://badge.fury.io/js/@openfeature%2Fweb-sdk.svg)](https://www.npmjs.com/package/@openfeature/web-sdk)
14
- [![Specification](https://img.shields.io/static/v1?label=Specification&message=v0.5.2&color=yellow)](https://github.com/open-feature/spec/tree/v0.5.2)
14
+ [![Specification](https://img.shields.io/static/v1?label=Specification&message=v0.6.0&color=yellow)](https://github.com/open-feature/spec/tree/v0.6.0)
15
15
 
16
16
  ## 🧪 This SDK is experimental
17
17
 
@@ -22,11 +22,14 @@ For more information, see this [issue](https://github.com/open-feature/spec/issu
22
22
 
23
23
  ### What is OpenFeature?
24
24
 
25
- [OpenFeature][openfeature-website] is an open standard that provides a vendor-agnostic, community-driven API for feature flagging that works with your favorite feature flag management tool.
25
+ [OpenFeature][openfeature-website] is an open standard that provides a vendor-agnostic, community-driven API for feature
26
+ flagging that works with your favorite feature flag management tool.
26
27
 
27
28
  ### Why standardize feature flags?
28
29
 
29
- Standardizing feature flags unifies tools and vendors behind a common interface which avoids vendor lock-in at the code level. Additionally, it offers a framework for building extensions and integrations and allows providers to focus on their unique value proposition.
30
+ Standardizing feature flags unifies tools and vendors behind a common interface which avoids vendor lock-in at the code
31
+ level. Additionally, it offers a framework for building extensions and integrations and allows providers to focus on
32
+ their unique value proposition.
30
33
 
31
34
  ## 🔍 Requirements:
32
35
 
@@ -72,7 +75,8 @@ const boolValue = client.getBooleanValue('boolFlag', false);
72
75
 
73
76
  ### Context-aware evaluation:
74
77
 
75
- Sometimes the value of a flag must take into account some dynamic criteria about the application or user, such as the user location, IP, email address, or the location of the server.
78
+ Sometimes the value of a flag must take into account some dynamic criteria about the application or user, such as the
79
+ user location, IP, email address, or the location of the server.
76
80
  In OpenFeature, we refer to this as [`targeting`](https://openfeature.dev/specification/glossary#targeting).
77
81
  If the flag system you're using supports targeting, you can provide the input data using the `EvaluationContext`.
78
82
 
@@ -86,7 +90,10 @@ const boolValue = client.getBooleanValue('some-flag', false);
86
90
 
87
91
  ### Providers:
88
92
 
89
- To develop a provider, you need to create a new project and include the OpenFeature SDK as a dependency. This can be a new repository or included in an existing contrib repository available under the OpenFeature organization. Finally, you’ll then need to write the provider itself. In most languages, this can be accomplished by implementing the provider interface exported by the OpenFeature SDK.
93
+ To develop a provider, you need to create a new project and include the OpenFeature SDK as a dependency. This can be a
94
+ new repository or included in an existing contrib repository available under the OpenFeature organization. Finally,
95
+ you’ll then need to write the provider itself. In most languages, this can be accomplished by implementing the provider
96
+ interface exported by the OpenFeature SDK.
90
97
 
91
98
  ```typescript
92
99
  import { JsonValue, Provider, ResolutionDetails } from '@openfeature/web-sdk';
@@ -94,7 +101,7 @@ import { JsonValue, Provider, ResolutionDetails } from '@openfeature/web-sdk';
94
101
  // implement the provider interface
95
102
  class MyProvider implements Provider {
96
103
  readonly metadata = {
97
- name: 'My Provider',
104
+ name: 'My Provider'
98
105
  } as const;
99
106
 
100
107
  resolveBooleanEvaluation(flagKey: string, defaultValue: boolean): ResolutionDetails<boolean> {
@@ -118,7 +125,9 @@ See [here](https://openfeature.dev/docs/reference/technologies/server/javascript
118
125
 
119
126
  ### Hooks:
120
127
 
121
- Hooks are a mechanism that allow for the addition of arbitrary behavior at well-defined points of the flag evaluation life-cycle. Use cases include validation of the resolved flag value, modifying or adding data to the evaluation context, logging, telemetry, and tracking.
128
+ Hooks are a mechanism that allow for the addition of arbitrary behavior at well-defined points of the flag evaluation
129
+ life-cycle. Use cases include validation of the resolved flag value, modifying or adding data to the evaluation context,
130
+ logging, telemetry, and tracking.
122
131
 
123
132
  ```typescript
124
133
  import { OpenFeature, Hook, HookContext } from '@openfeature/web-sdk';
@@ -136,7 +145,8 @@ See [here](https://openfeature.dev/docs/reference/technologies/server/javascript
136
145
 
137
146
  ### Logging:
138
147
 
139
- You can implement the `Logger` interface (compatible with the `console` object, and implementations from common logging libraries such as [winston](https://www.npmjs.com/package/winston)) and set it on the global API object.
148
+ You can implement the `Logger` interface (compatible with the `console` object, and implementations from common logging
149
+ libraries such as [winston](https://www.npmjs.com/package/winston)) and set it on the global API object.
140
150
 
141
151
  ```typescript
142
152
  // implement logger
@@ -144,12 +154,15 @@ class MyLogger implements Logger {
144
154
  error(...args: unknown[]): void {
145
155
  // implement me
146
156
  }
157
+
147
158
  warn(...args: unknown[]): void {
148
159
  // implement me
149
160
  }
161
+
150
162
  info(...args: unknown[]): void {
151
163
  // implement me
152
164
  }
165
+
153
166
  debug(...args: unknown[]): void {
154
167
  // implement me
155
168
  }
@@ -159,6 +172,64 @@ class MyLogger implements Logger {
159
172
  OpenFeature.setLogger(new MyLogger());
160
173
  ```
161
174
 
175
+ ### Named clients:
176
+
177
+ You can have several clients, that can be referenced by a name.
178
+ Every client can have a different provider assigned. If no provider is assigned to a named client, the global default
179
+ provider is used.
180
+
181
+ ```typescript
182
+ import { OpenFeature, ProviderEvents } from '@openfeature/web-sdk';
183
+
184
+ OpenFeature.setProvider(new YourProviderOfChoice())
185
+ OpenFeature.setProvider("client-1", new YourOtherProviderOfChoice())
186
+
187
+ // Uses YourProviderOfChoice (the default)
188
+ const unnamedClient = OpenFeature.getClient()
189
+
190
+ // Uses YourOtherProviderOfChoice as it is set explicitly
191
+ const client1 = OpenFeature.getClient("client-1")
192
+
193
+ // Uses YourProviderOfChoice as no provider is set
194
+ const client2 = OpenFeature.getClient("client-2")
195
+ ```
196
+
197
+ ### Events:
198
+
199
+ Events provide a way to react to state changes in the provider or underlying flag management system.
200
+ You can listen to events of either the OpenFeature API or individual clients.
201
+
202
+ The events after initialization, `PROVIDER_READY` on success, `PROVIDER_ERROR` on failure during initialization,
203
+ are dispatched for every provider.
204
+ However, other event types may not be supported by your provider.
205
+ Please refer to the documentation of the provider you're using to see what events are supported.
206
+
207
+ ```typescript
208
+ import { OpenFeature, ProviderEvents } from '@openfeature/web-sdk';
209
+
210
+ // OpenFeature API
211
+ OpenFeature.addHandler(ProviderEvents.Ready, (eventDetails) => {
212
+ console.log(`Ready event from: ${eventDetails.clientName}:`, eventDetails);
213
+ });
214
+
215
+ // Specific client
216
+ const client = OpenFeature.getClient();
217
+ client.addHandler(ProviderEvents.Error, async (eventDetails) => {
218
+ console.log(`Error event from: ${eventDetails.clientName}:`, eventDetails);
219
+ });
220
+ ```
221
+
222
+ ### Shutdown:
223
+
224
+ The OpenFeature API provides a close function to perform a cleanup of all registered providers.
225
+ This should only be called when your application is in the process of shutting down.
226
+
227
+ ```typescript
228
+ import { OpenFeature, ProviderEvents } from '@openfeature/web-sdk';
229
+
230
+ await OpenFeature.close()
231
+ ```
232
+
162
233
  ### Complete API documentation:
163
234
 
164
235
  See [here](https://open-feature.github.io/js-sdk/modules/OpenFeature_Web_SDK.html) for the complete API documentation.
package/dist/cjs/index.js CHANGED
@@ -727,6 +727,7 @@ var OpenFeatureCommonAPI = class {
727
727
  this._context = {};
728
728
  this._logger = new DefaultLogger();
729
729
  this._events = new OpenFeatureEventEmitter(() => this._logger);
730
+ this._clientEventHandlers = /* @__PURE__ */ new Map();
730
731
  this._clientProviders = /* @__PURE__ */ new Map();
731
732
  this._clientEvents = /* @__PURE__ */ new Map();
732
733
  }
@@ -781,7 +782,7 @@ var OpenFeatureCommonAPI = class {
781
782
  if (oldProvider === provider) {
782
783
  return this;
783
784
  }
784
- const clientEmitter = this.getEventEmitterForClient(clientName);
785
+ const clientEmitter = this.getAndCacheEventEmitterForClient(clientName);
785
786
  if (typeof provider.initialize === "function") {
786
787
  (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
787
788
  var _a2;
@@ -814,27 +815,44 @@ var OpenFeatureCommonAPI = class {
814
815
  }
815
816
  return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
816
817
  }
817
- getEventEmitterForClient(name) {
818
+ getAndCacheEventEmitterForClient(name) {
818
819
  const emitter = this._clientEvents.get(name);
819
820
  if (emitter) {
820
821
  return emitter;
821
822
  }
822
823
  const newEmitter = new OpenFeatureEventEmitter(() => this._logger);
823
824
  this._clientEvents.set(name, newEmitter);
825
+ const clientProvider = this.getProviderForClient(name);
826
+ Object.values(ProviderEvents).forEach(
827
+ (eventType) => {
828
+ var _a;
829
+ return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
830
+ newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name }));
831
+ }));
832
+ }
833
+ );
824
834
  return newEmitter;
825
835
  }
826
836
  transferListeners(oldProvider, newProvider, clientName, clientEmitter) {
827
837
  var _a;
828
- (_a = oldProvider.events) == null ? void 0 : _a.removeAllHandlers();
829
- Object.values(ProviderEvents).forEach(
838
+ (_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
839
+ var _a2;
840
+ return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
841
+ });
842
+ const newClientHandlers = Object.values(ProviderEvents).map(
830
843
  (eventType) => {
831
- var _a2;
832
- return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(eventType, (details) => __async(this, null, function* () {
844
+ const handler = (details) => __async(this, null, function* () {
833
845
  clientEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName }));
834
846
  this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName }));
835
- }));
847
+ });
848
+ return [eventType, handler];
836
849
  }
837
850
  );
851
+ this._clientEventHandlers.set(clientName, newClientHandlers);
852
+ newClientHandlers.forEach((eventHandler) => {
853
+ var _a2;
854
+ return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
855
+ });
838
856
  }
839
857
  close() {
840
858
  return __async(this, null, function* () {
@@ -982,7 +1000,7 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
982
1000
  // functions are passed here to make sure that these values are always up to date,
983
1001
  // and so we don't have to make these public properties on the API class.
984
1002
  () => this.getProviderForClient(name),
985
- () => this.getEventEmitterForClient(name),
1003
+ () => this.getAndCacheEventEmitterForClient(name),
986
1004
  () => this._logger,
987
1005
  { name, version }
988
1006
  );
@@ -992,9 +1010,9 @@ var OpenFeature = OpenFeatureAPI.getInstance();
992
1010
 
993
1011
  // src/client.ts
994
1012
  var OpenFeatureClient = class {
995
- constructor(providerAccessor, events, globalLogger, options) {
1013
+ constructor(providerAccessor, emitterAccessor, globalLogger, options) {
996
1014
  this.providerAccessor = providerAccessor;
997
- this.events = events;
1015
+ this.emitterAccessor = emitterAccessor;
998
1016
  this.globalLogger = globalLogger;
999
1017
  this.options = options;
1000
1018
  this._hooks = [];
@@ -1007,17 +1025,22 @@ var OpenFeatureClient = class {
1007
1025
  };
1008
1026
  }
1009
1027
  addHandler(eventType, handler) {
1010
- this.events().addHandler(eventType, handler);
1028
+ var _a;
1029
+ this.emitterAccessor().addHandler(eventType, handler);
1011
1030
  const providerReady = !this._provider.status || this._provider.status === "READY" /* READY */;
1012
1031
  if (eventType === "PROVIDER_READY" /* Ready */ && providerReady) {
1013
- handler({ clientName: this.metadata.name });
1032
+ try {
1033
+ handler({ clientName: this.metadata.name });
1034
+ } catch (err) {
1035
+ (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
1036
+ }
1014
1037
  }
1015
1038
  }
1016
1039
  removeHandler(notificationType, handler) {
1017
- this.events().removeHandler(notificationType, handler);
1040
+ this.emitterAccessor().removeHandler(notificationType, handler);
1018
1041
  }
1019
1042
  getHandlers(eventType) {
1020
- return this.events().getHandlers(eventType);
1043
+ return this.emitterAccessor().getHandlers(eventType);
1021
1044
  }
1022
1045
  setLogger(logger) {
1023
1046
  this._clientLogger = new SafeLogger(logger);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../node_modules/events/events.js", "../../src/index.ts", "../../../shared/src/types.ts", "../../../shared/src/errors/open-feature-error-abstract.ts", "../../../shared/src/errors/general-error.ts", "../../../shared/src/errors/flag-not-found-error.ts", "../../../shared/src/errors/parse-error.ts", "../../../shared/src/errors/type-mismatch-error.ts", "../../../shared/src/errors/targeting-key-missing-error.ts", "../../../shared/src/errors/invalid-context-error.ts", "../../../shared/src/logger.ts", "../../../shared/src/no-op-transaction-context-propagator.ts", "../../../shared/src/events.ts", "../../../shared/src/type-guards.ts", "../../../shared/src/open-feature.ts", "../../src/no-op-provider.ts", "../../src/open-feature.ts", "../../src/client.ts"],
4
- "sourcesContent": ["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n", "export * from './client';\nexport * from './no-op-provider';\nexport * from './open-feature';\nexport * from './types';\nexport * from '@openfeature/shared';", "import { OpenFeatureEventEmitter } from './events';\n\nexport type PrimitiveValue = null | boolean | string | number;\n\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type JsonArray = JsonValue[];\n\n/**\n * Represents a JSON node value.\n */\nexport type JsonValue = PrimitiveValue | JsonObject | JsonArray;\n\n/**\n * Represents a JSON node value, or Date.\n */\nexport type EvaluationContextValue =\n | PrimitiveValue\n | Date\n | { [key: string]: EvaluationContextValue }\n | EvaluationContextValue[];\n\n/**\n * A container for arbitrary contextual data that can be used as a basis for dynamic evaluation\n */\nexport type EvaluationContext = {\n /**\n * A string uniquely identifying the subject (end-user, or client service) of a flag evaluation.\n * Providers may require this field for fractional flag evaluation, rules, or overrides targeting specific users.\n * Such providers may behave unpredictably if a targeting key is not specified at flag resolution.\n */\n targetingKey?: string;\n} & Record<string, EvaluationContextValue>;\n\nexport type FlagValue = boolean | string | number | JsonValue;\n\nexport type FlagValueType = 'boolean' | 'string' | 'number' | 'object';\n\nexport interface Logger {\n error(...args: unknown[]): void;\n\n warn(...args: unknown[]): void;\n\n info(...args: unknown[]): void;\n\n debug(...args: unknown[]): void;\n}\n\nexport const StandardResolutionReasons = {\n /**\n * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.\n */\n TARGETING_MATCH: 'TARGETING_MATCH',\n\n /**\n * The resolved value was the result of pseudorandom assignment.\n */\n SPLIT: 'SPLIT',\n\n /**\n * The resolved value was the result of the flag being disabled in the management system.\n */\n DISABLED: 'DISABLED',\n\n /**\n * The resolved value was configured statically, or otherwise fell back to a pre-configured value.\n */\n DEFAULT: 'DEFAULT',\n\n /**\n * The reason for the resolved value could not be determined.\n */\n UNKNOWN: 'UNKNOWN',\n\n /**\n * The resolved value is static (no dynamic evaluation).\n */\n STATIC: 'STATIC',\n\n /**\n * The resolved value was retrieved from cache.\n */\n CACHED: 'CACHED',\n\n /**\n * The resolved value was the result of an error.\n *\n * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.\n */\n ERROR: 'ERROR',\n} as const;\n\nexport enum ErrorCode {\n /**\n * The value was resolved before the provider was ready.\n */\n PROVIDER_NOT_READY = 'PROVIDER_NOT_READY',\n\n /**\n * The flag could not be found.\n */\n FLAG_NOT_FOUND = 'FLAG_NOT_FOUND',\n\n /**\n * An error was encountered parsing data, such as a flag configuration.\n */\n PARSE_ERROR = 'PARSE_ERROR',\n\n /**\n * The type of the flag value does not match the expected type.\n */\n TYPE_MISMATCH = 'TYPE_MISMATCH',\n\n /**\n * The provider requires a targeting key and one was not provided in the evaluation context.\n */\n TARGETING_KEY_MISSING = 'TARGETING_KEY_MISSING',\n\n /**\n * The evaluation context does not meet provider requirements.\n */\n INVALID_CONTEXT = 'INVALID_CONTEXT',\n\n /**\n * An error with an unspecified code.\n */\n GENERAL = 'GENERAL',\n}\n\nexport type ResolutionReason = keyof typeof StandardResolutionReasons | (string & Record<never, never>);\n\n/**\n * A structure which supports definition of arbitrary properties, with keys of type string, and values of type boolean, string, or number.\n *\n * This structure is populated by a provider for use by an Application Author (via the Evaluation API) or an Application Integrator (via hooks).\n */\nexport type FlagMetadata = Record<string, string | number | boolean>;\n\nexport type ResolutionDetails<U> = {\n value: U;\n variant?: string;\n flagMetadata?: FlagMetadata;\n reason?: ResolutionReason;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport type EvaluationDetails<T extends FlagValue> = {\n flagKey: string;\n flagMetadata: Readonly<FlagMetadata>;\n} & ResolutionDetails<T>;\n\nexport interface ManageContext<T> {\n /**\n * Access the evaluation context set on the receiver.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n\n /**\n * Sets evaluation context that will be used during flag evaluations\n * on this receiver.\n * @template T The type of the receiver\n * @param {EvaluationContext} context Evaluation context\n * @returns {T} The receiver (this object)\n */\n setContext(context: EvaluationContext): T;\n}\n\nexport interface ManageLogger<T> {\n /**\n * Sets a logger on this receiver. This logger supersedes to the global logger\n * and is passed to various components in the SDK.\n * The logger configured on the global API object will be used for all evaluations,\n * unless overridden in a particular client.\n * @template T The type of the receiver\n * @param {Logger} logger The logger to be used\n * @returns {T} The receiver (this object)\n */\n setLogger(logger: Logger): T;\n}\n\nexport type HookHints = Readonly<Record<string, unknown>>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface Metadata {}\n\nexport interface ClientMetadata extends Metadata {\n readonly version?: string;\n readonly name?: string;\n readonly providerMetadata: ProviderMetadata;\n}\n\nexport interface ProviderMetadata extends Metadata {\n readonly name: string;\n}\n\nexport interface HookContext<T extends FlagValue = FlagValue> {\n readonly flagKey: string;\n readonly defaultValue: T;\n readonly flagValueType: FlagValueType;\n readonly context: Readonly<EvaluationContext>;\n readonly clientMetadata: ClientMetadata;\n readonly providerMetadata: ProviderMetadata;\n readonly logger: Logger;\n}\n\nexport interface BeforeHookContext extends HookContext {\n context: EvaluationContext;\n}\n\n/**\n * Transaction context is a mechanism for adding transaction specific context that\n * is merged with evaluation context prior to flag evaluation. Examples of potential\n * transaction specific context include: a user id, user agent, or request path.\n */\nexport type TransactionContext = EvaluationContext;\n\nexport interface ManageTransactionContextPropagator<T> extends TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets a transaction context propagator on this receiver. The transaction context\n * propagator is responsible for persisting context for the duration of a single\n * transaction.\n * @experimental\n * @template T The type of the receiver\n * @param {TransactionContextPropagator} transactionContextPropagator The context propagator to be used\n * @returns {T} The receiver (this object)\n */\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): T;\n}\n\nexport interface TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Returns the currently defined transaction context using the registered transaction\n * context propagator.\n * @experimental\n * @returns {TransactionContext} The current transaction context\n */\n getTransactionContext(): TransactionContext;\n\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets the transaction context using the registered transaction context propagator.\n * @experimental\n * @template R The return value of the callback\n * @param {TransactionContext} transactionContext The transaction specific context\n * @param {(...args: unknown[]) => R} callback Callback function used to set the transaction context on the stack\n * @param {...unknown[]} args Optional arguments that are passed to the callback function\n */\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void;\n}\n\nexport enum ProviderStatus {\n NOT_READY = 'NOT_READY',\n READY = 'READY',\n ERROR = 'ERROR',\n}\n\nexport interface CommonProvider {\n readonly metadata: ProviderMetadata;\n readonly status?: ProviderStatus;\n\n /**\n * An event emitter for ProviderEvents.\n * @see ProviderEvents\n */\n events?: OpenFeatureEventEmitter;\n\n onClose?(): Promise<void>;\n\n /**\n * A handler function used to setup the provider.\n * Called by the SDK after the provider is set.\n * When the returned promise resolves, the SDK fires the ProviderEvents.Ready event.\n * If the returned promise rejects, the SDK fires the ProviderEvents.Error event.\n * Use this function to perform any context-dependent setup within the provider.\n * @param context\n */\n initialize?(context?: EvaluationContext): Promise<void>;\n}\n", "import { ErrorCode } from '../types';\n\nexport abstract class OpenFeatureError extends Error {\n abstract code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, OpenFeatureError.prototype);\n this.name = 'OpenFeatureError';\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class GeneralError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, GeneralError.prototype);\n this.name = 'GeneralError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class FlagNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, FlagNotFoundError.prototype);\n this.name = 'FlagNotFoundError';\n this.code = ErrorCode.FLAG_NOT_FOUND;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class ParseError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, ParseError.prototype);\n this.name = 'ParseError';\n this.code = ErrorCode.PARSE_ERROR;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TypeMismatchError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TypeMismatchError.prototype);\n this.name = 'TypeMismatchError';\n this.code = ErrorCode.TYPE_MISMATCH;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TargetingKeyMissingError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);\n this.name = 'TargetingKeyMissingError';\n this.code = ErrorCode.TARGETING_KEY_MISSING;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class InvalidContextError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, InvalidContextError.prototype);\n this.name = 'InvalidContextError';\n this.code = ErrorCode.INVALID_CONTEXT;\n }\n}\n", "/* eslint-disable @typescript-eslint/no-empty-function */\nimport { Logger } from './types';\n\nconst LOG_LEVELS: Array<keyof Logger> = ['error', 'warn', 'info', 'debug'];\nexport class DefaultLogger implements Logger {\n error(...args: unknown[]): void {\n console.error(...args);\n }\n warn(...args: unknown[]): void {\n console.warn(...args);\n }\n info(): void {}\n debug(): void {}\n}\n\nexport class SafeLogger implements Logger {\n private readonly logger: Logger;\n private readonly fallbackLogger = new DefaultLogger();\n\n constructor(logger: Logger) {\n try {\n for (const level of LOG_LEVELS) {\n if (!logger[level] || typeof logger[level] !== 'function') {\n throw new Error(`The provided logger is missing the ${level} method.`);\n }\n }\n this.logger = logger;\n } catch (err) {\n console.error(err);\n console.error('Falling back to the default logger.');\n this.logger = this.fallbackLogger;\n }\n }\n\n error(...args: unknown[]): void {\n this.log('error', ...args);\n }\n warn(...args: unknown[]): void {\n this.log('warn', ...args);\n }\n info(...args: unknown[]): void {\n this.log('info', ...args);\n }\n debug(...args: unknown[]): void {\n this.log('debug', ...args);\n }\n\n private log(level: keyof Logger, ...args: unknown[]) {\n try {\n this.logger[level](...args);\n } catch (error) {\n this.fallbackLogger[level](...args);\n }\n }\n}\n", "import { EvaluationContext, TransactionContextPropagator } from './types';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext(_: EvaluationContext, callback: () => void): void {\n callback();\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import { Logger, ManageLogger } from './types';\nimport EventEmitter from 'events';\nimport { SafeLogger } from './logger';\n\nexport type EventMetadata = {\n [key: string]: string | boolean | number;\n};\n\nexport type EventDetails = {\n clientName?: string;\n message?: string;\n flagsChanged?: string[];\n metadata?: EventMetadata;\n};\n\nexport type EventHandler = (eventDetails?: EventDetails) => Promise<unknown> | unknown;\n\nexport interface Eventing {\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * @param {ProviderEvents} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n */\n addHandler(eventType: ProviderEvents, handler: EventHandler): void;\n\n /**\n * Removes a handler for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void;\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers(eventType: ProviderEvents): EventHandler[];\n}\n\nexport enum ProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n\n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n Stale = 'PROVIDER_STALE',\n}\n\nexport class OpenFeatureEventEmitter implements ManageLogger<OpenFeatureEventEmitter> {\n private readonly _handlers = new WeakMap<EventHandler, EventHandler>();\n private readonly eventEmitter = new EventEmitter({ captureRejections: true });\n private _eventLogger?: Logger;\n\n constructor(private readonly globalLogger?: () => Logger) {\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n\n emit(eventType: ProviderEvents, context?: EventDetails): void {\n this.eventEmitter.emit(eventType, context);\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n // The handlers have to be wrapped with an async function because if a synchronous functions throws an error,\n // the other handlers will not run.\n const asyncHandler = async (context?: EventDetails) => {\n await handler(context);\n };\n // The async handler has to be written to the map, because we need to get the wrapper function when deleting a listener\n this._handlers.set(handler, asyncHandler);\n this.eventEmitter.on(eventType, asyncHandler);\n }\n\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void {\n // Get the wrapper function for this handler, to delete it from the event emitter\n const asyncHandler = this._handlers.get(handler);\n\n if (!asyncHandler) {\n return;\n }\n\n this.eventEmitter.removeListener(eventType, asyncHandler);\n }\n\n removeAllHandlers(eventType?: ProviderEvents): void {\n // If giving undefined, the listeners are not removed, so we have to check explicitly\n if (eventType) {\n this.eventEmitter.removeAllListeners(eventType);\n } else {\n this.eventEmitter.removeAllListeners();\n }\n }\n\n getHandlers(eventType: ProviderEvents): EventHandler[] {\n return this.eventEmitter.listeners(eventType) as EventHandler[];\n }\n\n setLogger(logger: Logger): this {\n this._eventLogger = new SafeLogger(logger);\n return this;\n }\n\n private get _logger() {\n return this._eventLogger || this.globalLogger?.();\n }\n}\n", "/**\n * Checks whether the parameter is a string.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Returns the parameter if it is a string, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {string|undefined} The parameter if it is a string, otherwise undefined\n */\nexport function stringOrUndefined(value: unknown): string | undefined {\n return isString(value) ? value : undefined;\n}\n\n/**\n * Checks whether the parameter is an object.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is an object\n */\nexport function isObject<T extends object>(value: unknown): value is T {\n return typeof value === 'object';\n}\n\n/**\n * Returns the parameter if it is an object, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {object|undefined} The parameter if it is an object, otherwise undefined\n */\nexport function objectOrUndefined<T extends object>(value: unknown): T | undefined {\n return isObject<T>(value) ? value : undefined;\n}\n", "import { DefaultLogger, SafeLogger } from './logger';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } from './no-op-transaction-context-propagator';\nimport {\n CommonProvider,\n EvaluationContext,\n Logger,\n ProviderMetadata,\n TransactionContext,\n TransactionContextPropagator,\n} from './types';\nimport { EventDetails, EventHandler, Eventing, OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport { objectOrUndefined, stringOrUndefined } from './type-guards';\n\nexport abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProvider> implements Eventing {\n protected _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n protected _context: EvaluationContext = {};\n protected _logger: Logger = new DefaultLogger();\n\n protected abstract _defaultProvider: P;\n\n private readonly _events = new OpenFeatureEventEmitter(() => this._logger);\n protected _clientProviders: Map<string, P> = new Map();\n protected _clientEvents: Map<string | undefined, OpenFeatureEventEmitter> = new Map();\n\n abstract clearHooks(): this;\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n /**\n * Get metadata about registered provider.\n * @returns {ProviderMetadata} Provider Metadata\n */\n get providerMetadata(): ProviderMetadata {\n return this._defaultProvider.metadata;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * When changing the provider, the currently attached handlers will listen to the events of the new provider.\n * @param {ProviderEvents} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n */\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this._events.addHandler(eventType, handler);\n }\n\n /**\n * Removes a handler for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this._events.removeHandler(eventType, handler);\n }\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers(eventType: ProviderEvents): EventHandler[] {\n return this._events.getHandlers(eventType);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by unnamed clients and named clients to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing clients without a name.\n * @template P\n * @param {P} provider The provider responsible for flag evaluations.\n * @returns {OpenFeatureCommonAPI} OpenFeature API\n */\n setProvider(provider: P): this;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients with that name.\n * @template P\n * @param {string} clientName The name to identify the client\n * @param {P} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(clientName: string, provider: P): this;\n setProvider(clientOrProvider?: string | P, providerOrUndefined?: P): this {\n const clientName = stringOrUndefined(clientOrProvider);\n const provider = objectOrUndefined<P>(clientOrProvider) ?? objectOrUndefined<P>(providerOrUndefined);\n\n if (!provider) {\n return this;\n }\n\n const oldProvider = this.getProviderForClient(clientName);\n\n // ignore no-ops\n if (oldProvider === provider) {\n return this;\n }\n\n const clientEmitter = this.getEventEmitterForClient(clientName);\n\n if (typeof provider.initialize === 'function') {\n provider\n .initialize?.(this._context)\n ?.then(() => {\n clientEmitter.emit(ProviderEvents.Ready, { clientName });\n this._events?.emit(ProviderEvents.Ready, { clientName });\n })\n ?.catch((error) => {\n clientEmitter.emit(ProviderEvents.Error, { clientName, message: error.message });\n this._events?.emit(ProviderEvents.Error, { clientName, message: error.message });\n });\n } else {\n clientEmitter.emit(ProviderEvents.Ready, { clientName });\n this._events?.emit(ProviderEvents.Ready, { clientName });\n }\n\n if (clientName) {\n this._clientProviders.set(clientName, provider);\n } else {\n this._defaultProvider = provider;\n }\n\n this.transferListeners(oldProvider, provider, clientName, clientEmitter);\n\n // Do not close a provider that is bound to any client\n if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {\n oldProvider?.onClose?.();\n }\n\n return this;\n }\n\n protected getProviderForClient(name?: string): P {\n if (!name) {\n return this._defaultProvider;\n }\n\n return this._clientProviders.get(name) ?? this._defaultProvider;\n }\n\n protected getEventEmitterForClient(name?: string): OpenFeatureEventEmitter {\n const emitter = this._clientEvents.get(name);\n\n if (emitter) {\n return emitter;\n }\n\n const newEmitter = new OpenFeatureEventEmitter(() => this._logger);\n this._clientEvents.set(name, newEmitter);\n return newEmitter;\n }\n\n private transferListeners(\n oldProvider: P,\n newProvider: P,\n clientName: string | undefined,\n clientEmitter: OpenFeatureEventEmitter\n ) {\n oldProvider.events?.removeAllHandlers();\n\n // iterate over the event types\n Object.values<ProviderEvents>(ProviderEvents).forEach((eventType) =>\n newProvider.events?.addHandler(eventType, async (details?: EventDetails) => {\n // on each event type, fire the associated handlers\n clientEmitter.emit(eventType, { ...details, clientName });\n this._events.emit(eventType, { ...details, clientName });\n })\n );\n }\n\n async close(): Promise<void> {\n try {\n await this?._defaultProvider?.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider, err);\n }\n\n const providers = Array.from(this._clientProviders);\n\n await Promise.all(\n providers.map(async ([, provider]) => {\n try {\n await provider.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider, err);\n }\n })\n );\n }\n\n private handleShutdownError(provider: P, err: unknown) {\n this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);\n this._logger.error((err as Error)?.stack);\n }\n\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): OpenFeatureCommonAPI<P> {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}\n", "import { JsonValue, ProviderStatus, ResolutionDetails } from '@openfeature/shared';\nimport { Provider } from './types';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n get status(): ProviderStatus {\n /**\n * This is due to the NoopProvider not being a real provider.\n * We do not want it to trigger the Ready event handlers, so we never set this to ready.\n * With the NoopProvider assigned, the client can be assumed to be uninitialized.\n * https://github.com/open-feature/js-sdk/pull/429#discussion_r1202642654\n */\n return ProviderStatus.NOT_READY;\n }\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import { EvaluationContext, FlagValue, Logger, OpenFeatureCommonAPI, SafeLogger } from '@openfeature/shared';\nimport { OpenFeatureClient } from './client';\nimport { NOOP_PROVIDER } from './no-op-provider';\nimport { Client, Hook, Provider } from './types';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider> {\n protected _hooks: Hook[] = [];\n protected _defaultProvider: Provider = NOOP_PROVIDER;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {\n super();\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n async setContext(context: EvaluationContext): Promise<void> {\n const oldContext = this._context;\n this._context = context;\n await this._defaultProvider?.onContextChange?.(oldContext, context);\n }\n\n /**\n * A factory function for creating new named OpenFeature clients. Clients can contain\n * their own state (e.g. logger, hook, context). Multiple clients can be used\n * to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} name The name of the client\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(name?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(name),\n () => this.getEventEmitterForClient(name),\n () => this._logger,\n { name, version }\n );\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import {\n ClientMetadata,\n ErrorCode,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n OpenFeatureError,\n OpenFeatureEventEmitter,\n ProviderEvents,\n ProviderStatus,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n} from '@openfeature/shared';\nimport { OpenFeature } from './open-feature';\nimport { Client, FlagEvaluationOptions, Hook, Provider } from './types';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\n\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly events: () => OpenFeatureEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n name: this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.events().addHandler(eventType, handler);\n const providerReady = !this._provider.status || this._provider.status === ProviderStatus.READY;\n\n if (eventType === ProviderEvents.Ready && providerReady) {\n // run immediately, we're ready.\n handler({ clientName: this.metadata.name });\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler) {\n this.events().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.events().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {}\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...OpenFeature.getHooks(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...OpenFeature.getContext(),\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: OpenFeature.providerMetadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze({}),\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n for (const hook of hooks) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n // use Object.assign to avoid modification of frozen hookContext\n Object.assign(hookContext.context, {\n ...hookContext.context,\n ...hook?.before?.(hookContext, Object.freeze(options.hookHints)),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n", "export * from './client';\nexport * from './no-op-provider';\nexport * from './open-feature';\nexport * from './types';\nexport * from '@openfeature/shared';", "import { OpenFeatureEventEmitter } from './events';\n\nexport type PrimitiveValue = null | boolean | string | number;\n\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type JsonArray = JsonValue[];\n\n/**\n * Represents a JSON node value.\n */\nexport type JsonValue = PrimitiveValue | JsonObject | JsonArray;\n\n/**\n * Represents a JSON node value, or Date.\n */\nexport type EvaluationContextValue =\n | PrimitiveValue\n | Date\n | { [key: string]: EvaluationContextValue }\n | EvaluationContextValue[];\n\n/**\n * A container for arbitrary contextual data that can be used as a basis for dynamic evaluation\n */\nexport type EvaluationContext = {\n /**\n * A string uniquely identifying the subject (end-user, or client service) of a flag evaluation.\n * Providers may require this field for fractional flag evaluation, rules, or overrides targeting specific users.\n * Such providers may behave unpredictably if a targeting key is not specified at flag resolution.\n */\n targetingKey?: string;\n} & Record<string, EvaluationContextValue>;\n\nexport type FlagValue = boolean | string | number | JsonValue;\n\nexport type FlagValueType = 'boolean' | 'string' | 'number' | 'object';\n\nexport interface Logger {\n error(...args: unknown[]): void;\n\n warn(...args: unknown[]): void;\n\n info(...args: unknown[]): void;\n\n debug(...args: unknown[]): void;\n}\n\nexport const StandardResolutionReasons = {\n /**\n * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.\n */\n TARGETING_MATCH: 'TARGETING_MATCH',\n\n /**\n * The resolved value was the result of pseudorandom assignment.\n */\n SPLIT: 'SPLIT',\n\n /**\n * The resolved value was the result of the flag being disabled in the management system.\n */\n DISABLED: 'DISABLED',\n\n /**\n * The resolved value was configured statically, or otherwise fell back to a pre-configured value.\n */\n DEFAULT: 'DEFAULT',\n\n /**\n * The reason for the resolved value could not be determined.\n */\n UNKNOWN: 'UNKNOWN',\n\n /**\n * The resolved value is static (no dynamic evaluation).\n */\n STATIC: 'STATIC',\n\n /**\n * The resolved value was retrieved from cache.\n */\n CACHED: 'CACHED',\n\n /**\n * The resolved value was the result of an error.\n *\n * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.\n */\n ERROR: 'ERROR',\n} as const;\n\nexport enum ErrorCode {\n /**\n * The value was resolved before the provider was ready.\n */\n PROVIDER_NOT_READY = 'PROVIDER_NOT_READY',\n\n /**\n * The flag could not be found.\n */\n FLAG_NOT_FOUND = 'FLAG_NOT_FOUND',\n\n /**\n * An error was encountered parsing data, such as a flag configuration.\n */\n PARSE_ERROR = 'PARSE_ERROR',\n\n /**\n * The type of the flag value does not match the expected type.\n */\n TYPE_MISMATCH = 'TYPE_MISMATCH',\n\n /**\n * The provider requires a targeting key and one was not provided in the evaluation context.\n */\n TARGETING_KEY_MISSING = 'TARGETING_KEY_MISSING',\n\n /**\n * The evaluation context does not meet provider requirements.\n */\n INVALID_CONTEXT = 'INVALID_CONTEXT',\n\n /**\n * An error with an unspecified code.\n */\n GENERAL = 'GENERAL',\n}\n\nexport type ResolutionReason = keyof typeof StandardResolutionReasons | (string & Record<never, never>);\n\n/**\n * A structure which supports definition of arbitrary properties, with keys of type string, and values of type boolean, string, or number.\n *\n * This structure is populated by a provider for use by an Application Author (via the Evaluation API) or an Application Integrator (via hooks).\n */\nexport type FlagMetadata = Record<string, string | number | boolean>;\n\nexport type ResolutionDetails<U> = {\n value: U;\n variant?: string;\n flagMetadata?: FlagMetadata;\n reason?: ResolutionReason;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport type EvaluationDetails<T extends FlagValue> = {\n flagKey: string;\n flagMetadata: Readonly<FlagMetadata>;\n} & ResolutionDetails<T>;\n\nexport interface ManageContext<T> {\n /**\n * Access the evaluation context set on the receiver.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n\n /**\n * Sets evaluation context that will be used during flag evaluations\n * on this receiver.\n * @template T The type of the receiver\n * @param {EvaluationContext} context Evaluation context\n * @returns {T} The receiver (this object)\n */\n setContext(context: EvaluationContext): T;\n}\n\nexport interface ManageLogger<T> {\n /**\n * Sets a logger on this receiver. This logger supersedes to the global logger\n * and is passed to various components in the SDK.\n * The logger configured on the global API object will be used for all evaluations,\n * unless overridden in a particular client.\n * @template T The type of the receiver\n * @param {Logger} logger The logger to be used\n * @returns {T} The receiver (this object)\n */\n setLogger(logger: Logger): T;\n}\n\nexport type HookHints = Readonly<Record<string, unknown>>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface Metadata {}\n\nexport interface ClientMetadata extends Metadata {\n readonly version?: string;\n readonly name?: string;\n readonly providerMetadata: ProviderMetadata;\n}\n\nexport interface ProviderMetadata extends Metadata {\n readonly name: string;\n}\n\nexport interface HookContext<T extends FlagValue = FlagValue> {\n readonly flagKey: string;\n readonly defaultValue: T;\n readonly flagValueType: FlagValueType;\n readonly context: Readonly<EvaluationContext>;\n readonly clientMetadata: ClientMetadata;\n readonly providerMetadata: ProviderMetadata;\n readonly logger: Logger;\n}\n\nexport interface BeforeHookContext extends HookContext {\n context: EvaluationContext;\n}\n\n/**\n * Transaction context is a mechanism for adding transaction specific context that\n * is merged with evaluation context prior to flag evaluation. Examples of potential\n * transaction specific context include: a user id, user agent, or request path.\n */\nexport type TransactionContext = EvaluationContext;\n\nexport interface ManageTransactionContextPropagator<T> extends TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets a transaction context propagator on this receiver. The transaction context\n * propagator is responsible for persisting context for the duration of a single\n * transaction.\n * @experimental\n * @template T The type of the receiver\n * @param {TransactionContextPropagator} transactionContextPropagator The context propagator to be used\n * @returns {T} The receiver (this object)\n */\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): T;\n}\n\nexport interface TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Returns the currently defined transaction context using the registered transaction\n * context propagator.\n * @experimental\n * @returns {TransactionContext} The current transaction context\n */\n getTransactionContext(): TransactionContext;\n\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets the transaction context using the registered transaction context propagator.\n * @experimental\n * @template R The return value of the callback\n * @param {TransactionContext} transactionContext The transaction specific context\n * @param {(...args: unknown[]) => R} callback Callback function used to set the transaction context on the stack\n * @param {...unknown[]} args Optional arguments that are passed to the callback function\n */\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void;\n}\n\nexport enum ProviderStatus {\n NOT_READY = 'NOT_READY',\n READY = 'READY',\n ERROR = 'ERROR',\n}\n\nexport interface CommonProvider {\n readonly metadata: ProviderMetadata;\n readonly status?: ProviderStatus;\n\n /**\n * An event emitter for ProviderEvents.\n * @see ProviderEvents\n */\n events?: OpenFeatureEventEmitter;\n\n onClose?(): Promise<void>;\n\n /**\n * A handler function used to setup the provider.\n * Called by the SDK after the provider is set.\n * When the returned promise resolves, the SDK fires the ProviderEvents.Ready event.\n * If the returned promise rejects, the SDK fires the ProviderEvents.Error event.\n * Use this function to perform any context-dependent setup within the provider.\n * @param context\n */\n initialize?(context?: EvaluationContext): Promise<void>;\n}\n", "import { ErrorCode } from '../types';\n\nexport abstract class OpenFeatureError extends Error {\n abstract code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, OpenFeatureError.prototype);\n this.name = 'OpenFeatureError';\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class GeneralError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, GeneralError.prototype);\n this.name = 'GeneralError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class FlagNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, FlagNotFoundError.prototype);\n this.name = 'FlagNotFoundError';\n this.code = ErrorCode.FLAG_NOT_FOUND;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class ParseError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, ParseError.prototype);\n this.name = 'ParseError';\n this.code = ErrorCode.PARSE_ERROR;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TypeMismatchError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TypeMismatchError.prototype);\n this.name = 'TypeMismatchError';\n this.code = ErrorCode.TYPE_MISMATCH;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TargetingKeyMissingError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);\n this.name = 'TargetingKeyMissingError';\n this.code = ErrorCode.TARGETING_KEY_MISSING;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class InvalidContextError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, InvalidContextError.prototype);\n this.name = 'InvalidContextError';\n this.code = ErrorCode.INVALID_CONTEXT;\n }\n}\n", "/* eslint-disable @typescript-eslint/no-empty-function */\nimport { Logger } from './types';\n\nconst LOG_LEVELS: Array<keyof Logger> = ['error', 'warn', 'info', 'debug'];\nexport class DefaultLogger implements Logger {\n error(...args: unknown[]): void {\n console.error(...args);\n }\n warn(...args: unknown[]): void {\n console.warn(...args);\n }\n info(): void {}\n debug(): void {}\n}\n\nexport class SafeLogger implements Logger {\n private readonly logger: Logger;\n private readonly fallbackLogger = new DefaultLogger();\n\n constructor(logger: Logger) {\n try {\n for (const level of LOG_LEVELS) {\n if (!logger[level] || typeof logger[level] !== 'function') {\n throw new Error(`The provided logger is missing the ${level} method.`);\n }\n }\n this.logger = logger;\n } catch (err) {\n console.error(err);\n console.error('Falling back to the default logger.');\n this.logger = this.fallbackLogger;\n }\n }\n\n error(...args: unknown[]): void {\n this.log('error', ...args);\n }\n warn(...args: unknown[]): void {\n this.log('warn', ...args);\n }\n info(...args: unknown[]): void {\n this.log('info', ...args);\n }\n debug(...args: unknown[]): void {\n this.log('debug', ...args);\n }\n\n private log(level: keyof Logger, ...args: unknown[]) {\n try {\n this.logger[level](...args);\n } catch (error) {\n this.fallbackLogger[level](...args);\n }\n }\n}\n", "import { EvaluationContext, TransactionContextPropagator } from './types';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext(_: EvaluationContext, callback: () => void): void {\n callback();\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import { Logger, ManageLogger } from './types';\nimport EventEmitter from 'events';\nimport { SafeLogger } from './logger';\n\nexport type EventMetadata = {\n [key: string]: string | boolean | number;\n};\n\nexport type EventDetails = {\n clientName?: string;\n message?: string;\n flagsChanged?: string[];\n metadata?: EventMetadata;\n};\n\nexport type EventHandler = (eventDetails?: EventDetails) => Promise<unknown> | unknown;\n\nexport interface Eventing {\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * @param {ProviderEvents} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n */\n addHandler(eventType: ProviderEvents, handler: EventHandler): void;\n\n /**\n * Removes a handler for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void;\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers(eventType: ProviderEvents): EventHandler[];\n}\n\nexport enum ProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n\n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n Stale = 'PROVIDER_STALE',\n}\n\nexport class OpenFeatureEventEmitter implements ManageLogger<OpenFeatureEventEmitter> {\n private readonly _handlers = new WeakMap<EventHandler, EventHandler>();\n private readonly eventEmitter = new EventEmitter({ captureRejections: true });\n private _eventLogger?: Logger;\n\n constructor(private readonly globalLogger?: () => Logger) {\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n\n emit(eventType: ProviderEvents, context?: EventDetails): void {\n this.eventEmitter.emit(eventType, context);\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n // The handlers have to be wrapped with an async function because if a synchronous functions throws an error,\n // the other handlers will not run.\n const asyncHandler = async (context?: EventDetails) => {\n await handler(context);\n };\n // The async handler has to be written to the map, because we need to get the wrapper function when deleting a listener\n this._handlers.set(handler, asyncHandler);\n this.eventEmitter.on(eventType, asyncHandler);\n }\n\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void {\n // Get the wrapper function for this handler, to delete it from the event emitter\n const asyncHandler = this._handlers.get(handler);\n\n if (!asyncHandler) {\n return;\n }\n\n this.eventEmitter.removeListener(eventType, asyncHandler);\n }\n\n removeAllHandlers(eventType?: ProviderEvents): void {\n // If giving undefined, the listeners are not removed, so we have to check explicitly\n if (eventType) {\n this.eventEmitter.removeAllListeners(eventType);\n } else {\n this.eventEmitter.removeAllListeners();\n }\n }\n\n getHandlers(eventType: ProviderEvents): EventHandler[] {\n return this.eventEmitter.listeners(eventType) as EventHandler[];\n }\n\n setLogger(logger: Logger): this {\n this._eventLogger = new SafeLogger(logger);\n return this;\n }\n\n private get _logger() {\n return this._eventLogger || this.globalLogger?.();\n }\n}\n", "/**\n * Checks whether the parameter is a string.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Returns the parameter if it is a string, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {string|undefined} The parameter if it is a string, otherwise undefined\n */\nexport function stringOrUndefined(value: unknown): string | undefined {\n return isString(value) ? value : undefined;\n}\n\n/**\n * Checks whether the parameter is an object.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is an object\n */\nexport function isObject<T extends object>(value: unknown): value is T {\n return typeof value === 'object';\n}\n\n/**\n * Returns the parameter if it is an object, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {object|undefined} The parameter if it is an object, otherwise undefined\n */\nexport function objectOrUndefined<T extends object>(value: unknown): T | undefined {\n return isObject<T>(value) ? value : undefined;\n}\n", "import { DefaultLogger, SafeLogger } from './logger';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } from './no-op-transaction-context-propagator';\nimport {\n CommonProvider,\n EvaluationContext,\n Logger,\n ProviderMetadata,\n TransactionContext,\n TransactionContextPropagator,\n} from './types';\nimport { EventDetails, EventHandler, Eventing, OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport { objectOrUndefined, stringOrUndefined } from './type-guards';\n\nexport abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProvider> implements Eventing {\n protected _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n protected _context: EvaluationContext = {};\n protected _logger: Logger = new DefaultLogger();\n\n protected abstract _defaultProvider: P;\n\n private readonly _events = new OpenFeatureEventEmitter(() => this._logger);\n private readonly _clientEventHandlers: Map<string | undefined, [ProviderEvents, EventHandler][]> = new Map();\n protected _clientProviders: Map<string, P> = new Map();\n protected _clientEvents: Map<string | undefined, OpenFeatureEventEmitter> = new Map();\n\n abstract clearHooks(): this;\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n /**\n * Get metadata about registered provider.\n * @returns {ProviderMetadata} Provider Metadata\n */\n get providerMetadata(): ProviderMetadata {\n return this._defaultProvider.metadata;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * When changing the provider, the currently attached handlers will listen to the events of the new provider.\n * @param {ProviderEvents} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n */\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this._events.addHandler(eventType, handler);\n }\n\n /**\n * Removes a handler for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this._events.removeHandler(eventType, handler);\n }\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers(eventType: ProviderEvents): EventHandler[] {\n return this._events.getHandlers(eventType);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by unnamed clients and named clients to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing clients without a name.\n * @template P\n * @param {P} provider The provider responsible for flag evaluations.\n * @returns {OpenFeatureCommonAPI} OpenFeature API\n */\n setProvider(provider: P): this;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients with that name.\n * @template P\n * @param {string} clientName The name to identify the client\n * @param {P} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(clientName: string, provider: P): this;\n setProvider(clientOrProvider?: string | P, providerOrUndefined?: P): this {\n const clientName = stringOrUndefined(clientOrProvider);\n const provider = objectOrUndefined<P>(clientOrProvider) ?? objectOrUndefined<P>(providerOrUndefined);\n\n if (!provider) {\n return this;\n }\n\n const oldProvider = this.getProviderForClient(clientName);\n\n // ignore no-ops\n if (oldProvider === provider) {\n return this;\n }\n\n const clientEmitter = this.getAndCacheEventEmitterForClient(clientName);\n\n if (typeof provider.initialize === 'function') {\n provider\n .initialize?.(this._context)\n ?.then(() => {\n clientEmitter.emit(ProviderEvents.Ready, { clientName });\n this._events?.emit(ProviderEvents.Ready, { clientName });\n })\n ?.catch((error) => {\n clientEmitter.emit(ProviderEvents.Error, { clientName, message: error.message });\n this._events?.emit(ProviderEvents.Error, { clientName, message: error.message });\n });\n } else {\n clientEmitter.emit(ProviderEvents.Ready, { clientName });\n this._events?.emit(ProviderEvents.Ready, { clientName });\n }\n\n if (clientName) {\n this._clientProviders.set(clientName, provider);\n } else {\n this._defaultProvider = provider;\n }\n\n this.transferListeners(oldProvider, provider, clientName, clientEmitter);\n\n // Do not close a provider that is bound to any client\n if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {\n oldProvider?.onClose?.();\n }\n\n return this;\n }\n\n protected getProviderForClient(name?: string): P {\n if (!name) {\n return this._defaultProvider;\n }\n\n return this._clientProviders.get(name) ?? this._defaultProvider;\n }\n\n protected getAndCacheEventEmitterForClient(name?: string): OpenFeatureEventEmitter {\n const emitter = this._clientEvents.get(name);\n\n if (emitter) {\n return emitter;\n }\n\n // lazily add the event emitters\n const newEmitter = new OpenFeatureEventEmitter(() => this._logger);\n this._clientEvents.set(name, newEmitter);\n\n const clientProvider = this.getProviderForClient(name);\n Object.values<ProviderEvents>(ProviderEvents).forEach((eventType) =>\n clientProvider.events?.addHandler(eventType, async (details?: EventDetails) => {\n newEmitter.emit(eventType, { ...details, clientName: name });\n })\n );\n\n return newEmitter;\n }\n\n private transferListeners(\n oldProvider: P,\n newProvider: P,\n clientName: string | undefined,\n clientEmitter: OpenFeatureEventEmitter\n ) {\n this._clientEventHandlers\n .get(clientName)\n ?.forEach((eventHandler) => oldProvider.events?.removeHandler(...eventHandler));\n\n // iterate over the event types\n const newClientHandlers = Object.values<ProviderEvents>(ProviderEvents).map<[ProviderEvents, EventHandler]>(\n (eventType) => {\n const handler = async (details?: EventDetails) => {\n // on each event type, fire the associated handlers\n clientEmitter.emit(eventType, { ...details, clientName });\n this._events.emit(eventType, { ...details, clientName });\n };\n\n return [eventType, handler];\n }\n );\n\n this._clientEventHandlers.set(clientName, newClientHandlers);\n newClientHandlers.forEach((eventHandler) => newProvider.events?.addHandler(...eventHandler));\n }\n\n async close(): Promise<void> {\n try {\n await this?._defaultProvider?.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider, err);\n }\n\n const providers = Array.from(this._clientProviders);\n\n await Promise.all(\n providers.map(async ([, provider]) => {\n try {\n await provider.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider, err);\n }\n })\n );\n }\n\n private handleShutdownError(provider: P, err: unknown) {\n this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);\n this._logger.error((err as Error)?.stack);\n }\n\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): OpenFeatureCommonAPI<P> {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}\n", "import { JsonValue, ProviderStatus, ResolutionDetails } from '@openfeature/shared';\nimport { Provider } from './types';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n get status(): ProviderStatus {\n /**\n * This is due to the NoopProvider not being a real provider.\n * We do not want it to trigger the Ready event handlers, so we never set this to ready.\n * With the NoopProvider assigned, the client can be assumed to be uninitialized.\n * https://github.com/open-feature/js-sdk/pull/429#discussion_r1202642654\n */\n return ProviderStatus.NOT_READY;\n }\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import { EvaluationContext, FlagValue, Logger, OpenFeatureCommonAPI, SafeLogger } from '@openfeature/shared';\nimport { OpenFeatureClient } from './client';\nimport { NOOP_PROVIDER } from './no-op-provider';\nimport { Client, Hook, Provider } from './types';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider> {\n protected _hooks: Hook[] = [];\n protected _defaultProvider: Provider = NOOP_PROVIDER;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {\n super();\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n async setContext(context: EvaluationContext): Promise<void> {\n const oldContext = this._context;\n this._context = context;\n await this._defaultProvider?.onContextChange?.(oldContext, context);\n }\n\n /**\n * A factory function for creating new named OpenFeature clients. Clients can contain\n * their own state (e.g. logger, hook, context). Multiple clients can be used\n * to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} name The name of the client\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(name?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(name),\n () => this.getAndCacheEventEmitterForClient(name),\n () => this._logger,\n { name, version }\n );\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import {\n ClientMetadata,\n ErrorCode,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n OpenFeatureError,\n OpenFeatureEventEmitter,\n ProviderEvents,\n ProviderStatus,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n} from '@openfeature/shared';\nimport { OpenFeature } from './open-feature';\nimport { Client, FlagEvaluationOptions, Hook, Provider } from './types';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\n\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly emitterAccessor: () => OpenFeatureEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n name: this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const providerReady = !this._provider.status || this._provider.status === ProviderStatus.READY;\n\n if (eventType === ProviderEvents.Ready && providerReady) {\n // run immediately, we're ready.\n try {\n handler({ clientName: this.metadata.name });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {}\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...OpenFeature.getHooks(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...OpenFeature.getContext(),\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: OpenFeature.providerMetadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze({}),\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n for (const hook of hooks) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n // use Object.assign to avoid modification of frozen hookContext\n Object.assign(hookContext.context, {\n ...hookContext.context,\n ...hook?.before?.(hookContext, Object.freeze(options.hookHints)),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,iDAAAA,SAAA;AAAA;AAuBA,QAAI,IAAI,OAAO,YAAY,WAAW,UAAU;AAChD,QAAI,eAAe,KAAK,OAAO,EAAE,UAAU,aACvC,EAAE,QACF,SAASC,cAAa,QAAQ,UAAU,MAAM;AAC9C,aAAO,SAAS,UAAU,MAAM,KAAK,QAAQ,UAAU,IAAI;AAAA,IAC7D;AAEF,QAAI;AACJ,QAAI,KAAK,OAAO,EAAE,YAAY,YAAY;AACxC,uBAAiB,EAAE;AAAA,IACrB,WAAW,OAAO,uBAAuB;AACvC,uBAAiB,SAASC,gBAAe,QAAQ;AAC/C,eAAO,OAAO,oBAAoB,MAAM,EACrC,OAAO,OAAO,sBAAsB,MAAM,CAAC;AAAA,MAChD;AAAA,IACF,OAAO;AACL,uBAAiB,SAASA,gBAAe,QAAQ;AAC/C,eAAO,OAAO,oBAAoB,MAAM;AAAA,MAC1C;AAAA,IACF;AAEA,aAAS,mBAAmB,SAAS;AACnC,UAAI,WAAW,QAAQ;AAAM,gBAAQ,KAAK,OAAO;AAAA,IACnD;AAEA,QAAI,cAAc,OAAO,SAAS,SAASC,aAAY,OAAO;AAC5D,aAAO,UAAU;AAAA,IACnB;AAEA,aAASC,gBAAe;AACtB,MAAAA,cAAa,KAAK,KAAK,IAAI;AAAA,IAC7B;AACA,IAAAJ,QAAO,UAAUI;AACjB,IAAAJ,QAAO,QAAQ,OAAO;AAGtB,IAAAI,cAAa,eAAeA;AAE5B,IAAAA,cAAa,UAAU,UAAU;AACjC,IAAAA,cAAa,UAAU,eAAe;AACtC,IAAAA,cAAa,UAAU,gBAAgB;AAIvC,QAAI,sBAAsB;AAE1B,aAAS,cAAc,UAAU;AAC/B,UAAI,OAAO,aAAa,YAAY;AAClC,cAAM,IAAI,UAAU,qEAAqE,OAAO,QAAQ;AAAA,MAC1G;AAAA,IACF;AAEA,WAAO,eAAeA,eAAc,uBAAuB;AAAA,MACzD,YAAY;AAAA,MACZ,KAAK,WAAW;AACd,eAAO;AAAA,MACT;AAAA,MACA,KAAK,SAAS,KAAK;AACjB,YAAI,OAAO,QAAQ,YAAY,MAAM,KAAK,YAAY,GAAG,GAAG;AAC1D,gBAAM,IAAI,WAAW,oGAAoG,MAAM,GAAG;AAAA,QACpI;AACA,8BAAsB;AAAA,MACxB;AAAA,IACF,CAAC;AAED,IAAAA,cAAa,OAAO,WAAW;AAE7B,UAAI,KAAK,YAAY,UACjB,KAAK,YAAY,OAAO,eAAe,IAAI,EAAE,SAAS;AACxD,aAAK,UAAU,uBAAO,OAAO,IAAI;AACjC,aAAK,eAAe;AAAA,MACtB;AAEA,WAAK,gBAAgB,KAAK,iBAAiB;AAAA,IAC7C;AAIA,IAAAA,cAAa,UAAU,kBAAkB,SAAS,gBAAgB,GAAG;AACnE,UAAI,OAAO,MAAM,YAAY,IAAI,KAAK,YAAY,CAAC,GAAG;AACpD,cAAM,IAAI,WAAW,kFAAkF,IAAI,GAAG;AAAA,MAChH;AACA,WAAK,gBAAgB;AACrB,aAAO;AAAA,IACT;AAEA,aAAS,iBAAiB,MAAM;AAC9B,UAAI,KAAK,kBAAkB;AACzB,eAAOA,cAAa;AACtB,aAAO,KAAK;AAAA,IACd;AAEA,IAAAA,cAAa,UAAU,kBAAkB,SAAS,kBAAkB;AAClE,aAAO,iBAAiB,IAAI;AAAA,IAC9B;AAEA,IAAAA,cAAa,UAAU,OAAO,SAAS,KAAK,MAAM;AAChD,UAAI,OAAO,CAAC;AACZ,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ;AAAK,aAAK,KAAK,UAAU,CAAC,CAAC;AACjE,UAAI,UAAW,SAAS;AAExB,UAAI,SAAS,KAAK;AAClB,UAAI,WAAW;AACb,kBAAW,WAAW,OAAO,UAAU;AAAA,eAChC,CAAC;AACR,eAAO;AAGT,UAAI,SAAS;AACX,YAAI;AACJ,YAAI,KAAK,SAAS;AAChB,eAAK,KAAK,CAAC;AACb,YAAI,cAAc,OAAO;AAGvB,gBAAM;AAAA,QACR;AAEA,YAAI,MAAM,IAAI,MAAM,sBAAsB,KAAK,OAAO,GAAG,UAAU,MAAM,GAAG;AAC5E,YAAI,UAAU;AACd,cAAM;AAAA,MACR;AAEA,UAAI,UAAU,OAAO,IAAI;AAEzB,UAAI,YAAY;AACd,eAAO;AAET,UAAI,OAAO,YAAY,YAAY;AACjC,qBAAa,SAAS,MAAM,IAAI;AAAA,MAClC,OAAO;AACL,YAAI,MAAM,QAAQ;AAClB,YAAI,YAAY,WAAW,SAAS,GAAG;AACvC,iBAAS,IAAI,GAAG,IAAI,KAAK,EAAE;AACzB,uBAAa,UAAU,CAAC,GAAG,MAAM,IAAI;AAAA,MACzC;AAEA,aAAO;AAAA,IACT;AAEA,aAAS,aAAa,QAAQ,MAAM,UAAU,SAAS;AACrD,UAAI;AACJ,UAAI;AACJ,UAAI;AAEJ,oBAAc,QAAQ;AAEtB,eAAS,OAAO;AAChB,UAAI,WAAW,QAAW;AACxB,iBAAS,OAAO,UAAU,uBAAO,OAAO,IAAI;AAC5C,eAAO,eAAe;AAAA,MACxB,OAAO;AAGL,YAAI,OAAO,gBAAgB,QAAW;AACpC,iBAAO;AAAA,YAAK;AAAA,YAAe;AAAA,YACf,SAAS,WAAW,SAAS,WAAW;AAAA,UAAQ;AAI5D,mBAAS,OAAO;AAAA,QAClB;AACA,mBAAW,OAAO,IAAI;AAAA,MACxB;AAEA,UAAI,aAAa,QAAW;AAE1B,mBAAW,OAAO,IAAI,IAAI;AAC1B,UAAE,OAAO;AAAA,MACX,OAAO;AACL,YAAI,OAAO,aAAa,YAAY;AAElC,qBAAW,OAAO,IAAI,IACpB,UAAU,CAAC,UAAU,QAAQ,IAAI,CAAC,UAAU,QAAQ;AAAA,QAExD,WAAW,SAAS;AAClB,mBAAS,QAAQ,QAAQ;AAAA,QAC3B,OAAO;AACL,mBAAS,KAAK,QAAQ;AAAA,QACxB;AAGA,YAAI,iBAAiB,MAAM;AAC3B,YAAI,IAAI,KAAK,SAAS,SAAS,KAAK,CAAC,SAAS,QAAQ;AACpD,mBAAS,SAAS;AAGlB,cAAI,IAAI,IAAI,MAAM,iDACE,SAAS,SAAS,MAAM,OAAO,IAAI,IAAI,mEAEvB;AACpC,YAAE,OAAO;AACT,YAAE,UAAU;AACZ,YAAE,OAAO;AACT,YAAE,QAAQ,SAAS;AACnB,6BAAmB,CAAC;AAAA,QACtB;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,IAAAA,cAAa,UAAU,cAAc,SAAS,YAAY,MAAM,UAAU;AACxE,aAAO,aAAa,MAAM,MAAM,UAAU,KAAK;AAAA,IACjD;AAEA,IAAAA,cAAa,UAAU,KAAKA,cAAa,UAAU;AAEnD,IAAAA,cAAa,UAAU,kBACnB,SAAS,gBAAgB,MAAM,UAAU;AACvC,aAAO,aAAa,MAAM,MAAM,UAAU,IAAI;AAAA,IAChD;AAEJ,aAAS,cAAc;AACrB,UAAI,CAAC,KAAK,OAAO;AACf,aAAK,OAAO,eAAe,KAAK,MAAM,KAAK,MAAM;AACjD,aAAK,QAAQ;AACb,YAAI,UAAU,WAAW;AACvB,iBAAO,KAAK,SAAS,KAAK,KAAK,MAAM;AACvC,eAAO,KAAK,SAAS,MAAM,KAAK,QAAQ,SAAS;AAAA,MACnD;AAAA,IACF;AAEA,aAAS,UAAU,QAAQ,MAAM,UAAU;AACzC,UAAI,QAAQ,EAAE,OAAO,OAAO,QAAQ,QAAW,QAAgB,MAAY,SAAmB;AAC9F,UAAI,UAAU,YAAY,KAAK,KAAK;AACpC,cAAQ,WAAW;AACnB,YAAM,SAAS;AACf,aAAO;AAAA,IACT;AAEA,IAAAA,cAAa,UAAU,OAAO,SAASC,MAAK,MAAM,UAAU;AAC1D,oBAAc,QAAQ;AACtB,WAAK,GAAG,MAAM,UAAU,MAAM,MAAM,QAAQ,CAAC;AAC7C,aAAO;AAAA,IACT;AAEA,IAAAD,cAAa,UAAU,sBACnB,SAAS,oBAAoB,MAAM,UAAU;AAC3C,oBAAc,QAAQ;AACtB,WAAK,gBAAgB,MAAM,UAAU,MAAM,MAAM,QAAQ,CAAC;AAC1D,aAAO;AAAA,IACT;AAGJ,IAAAA,cAAa,UAAU,iBACnB,SAAS,eAAe,MAAM,UAAU;AACtC,UAAI,MAAM,QAAQ,UAAU,GAAG;AAE/B,oBAAc,QAAQ;AAEtB,eAAS,KAAK;AACd,UAAI,WAAW;AACb,eAAO;AAET,aAAO,OAAO,IAAI;AAClB,UAAI,SAAS;AACX,eAAO;AAET,UAAI,SAAS,YAAY,KAAK,aAAa,UAAU;AACnD,YAAI,EAAE,KAAK,iBAAiB;AAC1B,eAAK,UAAU,uBAAO,OAAO,IAAI;AAAA,aAC9B;AACH,iBAAO,OAAO,IAAI;AAClB,cAAI,OAAO;AACT,iBAAK,KAAK,kBAAkB,MAAM,KAAK,YAAY,QAAQ;AAAA,QAC/D;AAAA,MACF,WAAW,OAAO,SAAS,YAAY;AACrC,mBAAW;AAEX,aAAK,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACrC,cAAI,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,EAAE,aAAa,UAAU;AACzD,+BAAmB,KAAK,CAAC,EAAE;AAC3B,uBAAW;AACX;AAAA,UACF;AAAA,QACF;AAEA,YAAI,WAAW;AACb,iBAAO;AAET,YAAI,aAAa;AACf,eAAK,MAAM;AAAA,aACR;AACH,oBAAU,MAAM,QAAQ;AAAA,QAC1B;AAEA,YAAI,KAAK,WAAW;AAClB,iBAAO,IAAI,IAAI,KAAK,CAAC;AAEvB,YAAI,OAAO,mBAAmB;AAC5B,eAAK,KAAK,kBAAkB,MAAM,oBAAoB,QAAQ;AAAA,MAClE;AAEA,aAAO;AAAA,IACT;AAEJ,IAAAA,cAAa,UAAU,MAAMA,cAAa,UAAU;AAEpD,IAAAA,cAAa,UAAU,qBACnB,SAAS,mBAAmB,MAAM;AAChC,UAAI,WAAW,QAAQ;AAEvB,eAAS,KAAK;AACd,UAAI,WAAW;AACb,eAAO;AAGT,UAAI,OAAO,mBAAmB,QAAW;AACvC,YAAI,UAAU,WAAW,GAAG;AAC1B,eAAK,UAAU,uBAAO,OAAO,IAAI;AACjC,eAAK,eAAe;AAAA,QACtB,WAAW,OAAO,IAAI,MAAM,QAAW;AACrC,cAAI,EAAE,KAAK,iBAAiB;AAC1B,iBAAK,UAAU,uBAAO,OAAO,IAAI;AAAA;AAEjC,mBAAO,OAAO,IAAI;AAAA,QACtB;AACA,eAAO;AAAA,MACT;AAGA,UAAI,UAAU,WAAW,GAAG;AAC1B,YAAI,OAAO,OAAO,KAAK,MAAM;AAC7B,YAAI;AACJ,aAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,EAAE,GAAG;AAChC,gBAAM,KAAK,CAAC;AACZ,cAAI,QAAQ;AAAkB;AAC9B,eAAK,mBAAmB,GAAG;AAAA,QAC7B;AACA,aAAK,mBAAmB,gBAAgB;AACxC,aAAK,UAAU,uBAAO,OAAO,IAAI;AACjC,aAAK,eAAe;AACpB,eAAO;AAAA,MACT;AAEA,kBAAY,OAAO,IAAI;AAEvB,UAAI,OAAO,cAAc,YAAY;AACnC,aAAK,eAAe,MAAM,SAAS;AAAA,MACrC,WAAW,cAAc,QAAW;AAElC,aAAK,IAAI,UAAU,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,eAAK,eAAe,MAAM,UAAU,CAAC,CAAC;AAAA,QACxC;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEJ,aAAS,WAAW,QAAQ,MAAM,QAAQ;AACxC,UAAI,SAAS,OAAO;AAEpB,UAAI,WAAW;AACb,eAAO,CAAC;AAEV,UAAI,aAAa,OAAO,IAAI;AAC5B,UAAI,eAAe;AACjB,eAAO,CAAC;AAEV,UAAI,OAAO,eAAe;AACxB,eAAO,SAAS,CAAC,WAAW,YAAY,UAAU,IAAI,CAAC,UAAU;AAEnE,aAAO,SACL,gBAAgB,UAAU,IAAI,WAAW,YAAY,WAAW,MAAM;AAAA,IAC1E;AAEA,IAAAA,cAAa,UAAU,YAAY,SAAS,UAAU,MAAM;AAC1D,aAAO,WAAW,MAAM,MAAM,IAAI;AAAA,IACpC;AAEA,IAAAA,cAAa,UAAU,eAAe,SAAS,aAAa,MAAM;AAChE,aAAO,WAAW,MAAM,MAAM,KAAK;AAAA,IACrC;AAEA,IAAAA,cAAa,gBAAgB,SAAS,SAAS,MAAM;AACnD,UAAI,OAAO,QAAQ,kBAAkB,YAAY;AAC/C,eAAO,QAAQ,cAAc,IAAI;AAAA,MACnC,OAAO;AACL,eAAO,cAAc,KAAK,SAAS,IAAI;AAAA,MACzC;AAAA,IACF;AAEA,IAAAA,cAAa,UAAU,gBAAgB;AACvC,aAAS,cAAc,MAAM;AAC3B,UAAI,SAAS,KAAK;AAElB,UAAI,WAAW,QAAW;AACxB,YAAI,aAAa,OAAO,IAAI;AAE5B,YAAI,OAAO,eAAe,YAAY;AACpC,iBAAO;AAAA,QACT,WAAW,eAAe,QAAW;AACnC,iBAAO,WAAW;AAAA,QACpB;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,IAAAA,cAAa,UAAU,aAAa,SAAS,aAAa;AACxD,aAAO,KAAK,eAAe,IAAI,eAAe,KAAK,OAAO,IAAI,CAAC;AAAA,IACjE;AAEA,aAAS,WAAW,KAAK,GAAG;AAC1B,UAAI,OAAO,IAAI,MAAM,CAAC;AACtB,eAAS,IAAI,GAAG,IAAI,GAAG,EAAE;AACvB,aAAK,CAAC,IAAI,IAAI,CAAC;AACjB,aAAO;AAAA,IACT;AAEA,aAAS,UAAU,MAAM,OAAO;AAC9B,aAAO,QAAQ,IAAI,KAAK,QAAQ;AAC9B,aAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AAC9B,WAAK,IAAI;AAAA,IACX;AAEA,aAAS,gBAAgB,KAAK;AAC5B,UAAI,MAAM,IAAI,MAAM,IAAI,MAAM;AAC9B,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,EAAE,GAAG;AACnC,YAAI,CAAC,IAAI,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC;AAAA,MACnC;AACA,aAAO;AAAA,IACT;AAEA,aAAS,KAAK,SAAS,MAAM;AAC3B,aAAO,IAAI,QAAQ,SAAU,SAAS,QAAQ;AAC5C,iBAAS,cAAc,KAAK;AAC1B,kBAAQ,eAAe,MAAM,QAAQ;AACrC,iBAAO,GAAG;AAAA,QACZ;AAEA,iBAAS,WAAW;AAClB,cAAI,OAAO,QAAQ,mBAAmB,YAAY;AAChD,oBAAQ,eAAe,SAAS,aAAa;AAAA,UAC/C;AACA,kBAAQ,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;AAAA,QAClC;AAAC;AAED,uCAA+B,SAAS,MAAM,UAAU,EAAE,MAAM,KAAK,CAAC;AACtE,YAAI,SAAS,SAAS;AACpB,wCAA8B,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAEA,aAAS,8BAA8B,SAAS,SAAS,OAAO;AAC9D,UAAI,OAAO,QAAQ,OAAO,YAAY;AACpC,uCAA+B,SAAS,SAAS,SAAS,KAAK;AAAA,MACjE;AAAA,IACF;AAEA,aAAS,+BAA+B,SAAS,MAAM,UAAU,OAAO;AACtE,UAAI,OAAO,QAAQ,OAAO,YAAY;AACpC,YAAI,MAAM,MAAM;AACd,kBAAQ,KAAK,MAAM,QAAQ;AAAA,QAC7B,OAAO;AACL,kBAAQ,GAAG,MAAM,QAAQ;AAAA,QAC3B;AAAA,MACF,WAAW,OAAO,QAAQ,qBAAqB,YAAY;AAGzD,gBAAQ,iBAAiB,MAAM,SAAS,aAAa,KAAK;AAGxD,cAAI,MAAM,MAAM;AACd,oBAAQ,oBAAoB,MAAM,YAAY;AAAA,UAChD;AACA,mBAAS,GAAG;AAAA,QACd,CAAC;AAAA,MACH,OAAO;AACL,cAAM,IAAI,UAAU,wEAAwE,OAAO,OAAO;AAAA,MAC5G;AAAA,IACF;AAAA;AAAA;;;AChfA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACgDO,IAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA,EAIvC,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,OAAO;AAAA;AAAA;AAAA;AAAA,EAKP,UAAU;AAAA;AAAA;AAAA;AAAA,EAKV,SAAS;AAAA;AAAA;AAAA;AAAA,EAKT,SAAS;AAAA;AAAA;AAAA;AAAA,EAKT,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKR,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOR,OAAO;AACT;AAEO,IAAK,YAAL,kBAAKE,eAAL;AAIL,EAAAA,WAAA,wBAAqB;AAKrB,EAAAA,WAAA,oBAAiB;AAKjB,EAAAA,WAAA,iBAAc;AAKd,EAAAA,WAAA,mBAAgB;AAKhB,EAAAA,WAAA,2BAAwB;AAKxB,EAAAA,WAAA,qBAAkB;AAKlB,EAAAA,WAAA,aAAU;AAlCA,SAAAA;AAAA,GAAA;AA4KL,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,eAAY;AACZ,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,WAAQ;AAHE,SAAAA;AAAA,GAAA;;;ACtQL,IAAe,mBAAf,cAAwC,MAAM;AAAA,EAEnD,YAAY,SAAkB;AAC5B,UAAM,OAAO;AACb,WAAO,eAAe,MAAM,iBAAiB,SAAS;AACtD,SAAK,OAAO;AAAA,EACd;AACF;;;ACNO,IAAM,eAAN,cAA2B,iBAAiB;AAAA,EAEjD,YAAY,SAAkB;AAC5B,UAAM,OAAO;AACb,WAAO,eAAe,MAAM,aAAa,SAAS;AAClD,SAAK,OAAO;AACZ,SAAK;AAAA,EACP;AACF;;;ACRO,IAAM,oBAAN,cAAgC,iBAAiB;AAAA,EAEtD,YAAY,SAAkB;AAC5B,UAAM,OAAO;AACb,WAAO,eAAe,MAAM,kBAAkB,SAAS;AACvD,SAAK,OAAO;AACZ,SAAK;AAAA,EACP;AACF;;;ACRO,IAAM,aAAN,cAAyB,iBAAiB;AAAA,EAE/C,YAAY,SAAkB;AAC5B,UAAM,OAAO;AACb,WAAO,eAAe,MAAM,WAAW,SAAS;AAChD,SAAK,OAAO;AACZ,SAAK;AAAA,EACP;AACF;;;ACRO,IAAM,oBAAN,cAAgC,iBAAiB;AAAA,EAEtD,YAAY,SAAkB;AAC5B,UAAM,OAAO;AACb,WAAO,eAAe,MAAM,kBAAkB,SAAS;AACvD,SAAK,OAAO;AACZ,SAAK;AAAA,EACP;AACF;;;ACRO,IAAM,2BAAN,cAAuC,iBAAiB;AAAA,EAE7D,YAAY,SAAkB;AAC5B,UAAM,OAAO;AACb,WAAO,eAAe,MAAM,yBAAyB,SAAS;AAC9D,SAAK,OAAO;AACZ,SAAK;AAAA,EACP;AACF;;;ACRO,IAAM,sBAAN,cAAkC,iBAAiB;AAAA,EAExD,YAAY,SAAkB;AAC5B,UAAM,OAAO;AACb,WAAO,eAAe,MAAM,oBAAoB,SAAS;AACzD,SAAK,OAAO;AACZ,SAAK;AAAA,EACP;AACF;;;ACRA,IAAM,aAAkC,CAAC,SAAS,QAAQ,QAAQ,OAAO;AAClE,IAAM,gBAAN,MAAsC;AAAA,EAC3C,SAAS,MAAuB;AAC9B,YAAQ,MAAM,GAAG,IAAI;AAAA,EACvB;AAAA,EACA,QAAQ,MAAuB;AAC7B,YAAQ,KAAK,GAAG,IAAI;AAAA,EACtB;AAAA,EACA,OAAa;AAAA,EAAC;AAAA,EACd,QAAc;AAAA,EAAC;AACjB;AAEO,IAAM,aAAN,MAAmC;AAAA,EAIxC,YAAY,QAAgB;AAF5B,SAAiB,iBAAiB,IAAI,cAAc;AAGlD,QAAI;AACF,iBAAW,SAAS,YAAY;AAC9B,YAAI,CAAC,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK,MAAM,YAAY;AACzD,gBAAM,IAAI,MAAM,sCAAsC,eAAe;AAAA,QACvE;AAAA,MACF;AACA,WAAK,SAAS;AAAA,IAChB,SAAS,KAAP;AACA,cAAQ,MAAM,GAAG;AACjB,cAAQ,MAAM,qCAAqC;AACnD,WAAK,SAAS,KAAK;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,SAAS,MAAuB;AAC9B,SAAK,IAAI,SAAS,GAAG,IAAI;AAAA,EAC3B;AAAA,EACA,QAAQ,MAAuB;AAC7B,SAAK,IAAI,QAAQ,GAAG,IAAI;AAAA,EAC1B;AAAA,EACA,QAAQ,MAAuB;AAC7B,SAAK,IAAI,QAAQ,GAAG,IAAI;AAAA,EAC1B;AAAA,EACA,SAAS,MAAuB;AAC9B,SAAK,IAAI,SAAS,GAAG,IAAI;AAAA,EAC3B;AAAA,EAEQ,IAAI,UAAwB,MAAiB;AACnD,QAAI;AACF,WAAK,OAAO,KAAK,EAAE,GAAG,IAAI;AAAA,IAC5B,SAAS,OAAP;AACA,WAAK,eAAe,KAAK,EAAE,GAAG,IAAI;AAAA,IACpC;AAAA,EACF;AACF;;;ACpDA,IAAM,mCAAN,MAA+E;AAAA,EAC7E,wBAA2C;AACzC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,sBAAsB,GAAsB,UAA4B;AACtE,aAAS;AAAA,EACX;AACF;AAEO,IAAM,sCAAsC,IAAI,iCAAiC;;;ACXxF,oBAAyB;AAwClB,IAAK,iBAAL,kBAAKC,oBAAL;AAIL,EAAAA,gBAAA,WAAQ;AAKR,EAAAA,gBAAA,WAAQ;AAKR,EAAAA,gBAAA,0BAAuB;AAKvB,EAAAA,gBAAA,WAAQ;AAnBE,SAAAA;AAAA,GAAA;AAsBL,IAAM,0BAAN,MAA+E;AAAA,EAKpF,YAA6B,cAA6B;AAA7B;AAJ7B,SAAiB,YAAY,oBAAI,QAAoC;AACrE,SAAiB,eAAe,IAAI,cAAAC,QAAa,EAAE,mBAAmB,KAAK,CAAC;AAI1E,SAAK,aAAa,GAAG,SAAS,CAAC,QAAQ;AArE3C;AAsEM,iBAAK,YAAL,mBAAc,MAAM,gCAAgC;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,WAA2B,SAA8B;AAC5D,SAAK,aAAa,KAAK,WAAW,OAAO;AAAA,EAC3C;AAAA,EAEA,WAAW,WAA2B,SAA6B;AAGjE,UAAM,eAAe,CAAO,YAA2B;AACrD,YAAM,QAAQ,OAAO;AAAA,IACvB;AAEA,SAAK,UAAU,IAAI,SAAS,YAAY;AACxC,SAAK,aAAa,GAAG,WAAW,YAAY;AAAA,EAC9C;AAAA,EAEA,cAAc,WAA2B,SAA6B;AAEpE,UAAM,eAAe,KAAK,UAAU,IAAI,OAAO;AAE/C,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,SAAK,aAAa,eAAe,WAAW,YAAY;AAAA,EAC1D;AAAA,EAEA,kBAAkB,WAAkC;AAElD,QAAI,WAAW;AACb,WAAK,aAAa,mBAAmB,SAAS;AAAA,IAChD,OAAO;AACL,WAAK,aAAa,mBAAmB;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,YAAY,WAA2C;AACrD,WAAO,KAAK,aAAa,UAAU,SAAS;AAAA,EAC9C;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,eAAe,IAAI,WAAW,MAAM;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,IAAY,UAAU;AAtHxB;AAuHI,WAAO,KAAK,kBAAgB,UAAK,iBAAL;AAAA,EAC9B;AACF;;;ACpHO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU;AAC1B;AAOO,SAAS,kBAAkB,OAAoC;AACpE,SAAO,SAAS,KAAK,IAAI,QAAQ;AACnC;AAOO,SAAS,SAA2B,OAA4B;AACrE,SAAO,OAAO,UAAU;AAC1B;AAOO,SAAS,kBAAoC,OAA+B;AACjF,SAAO,SAAY,KAAK,IAAI,QAAQ;AACtC;;;ACrBO,IAAe,uBAAf,MAAmG;AAAA,EAAnG;AACL,SAAU,gCAA8D;AACxE,SAAU,WAA8B,CAAC;AACzC,SAAU,UAAkB,IAAI,cAAc;AAI9C,SAAiB,UAAU,IAAI,wBAAwB,MAAM,KAAK,OAAO;AACzE,SAAiB,uBAAkF,oBAAI,IAAI;AAC3G,SAAU,mBAAmC,oBAAI,IAAI;AACrD,SAAU,gBAAkE,oBAAI,IAAI;AAAA;AAAA,EAIpF,UAAU,QAAsB;AAC9B,SAAK,UAAU,IAAI,WAAW,MAAM;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,mBAAqC;AACvC,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AAAA,EAEA,aAAgC;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,WAA2B,SAA6B;AACjE,SAAK,QAAQ,WAAW,WAAW,OAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,WAA2B,SAA6B;AACpE,SAAK,QAAQ,cAAc,WAAW,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,WAA2C;AACrD,WAAO,KAAK,QAAQ,YAAY,SAAS;AAAA,EAC3C;AAAA,EAoBA,YAAY,kBAA+B,qBAA+B;AA3F5E;AA4FI,UAAM,aAAa,kBAAkB,gBAAgB;AACrD,UAAM,YAAW,uBAAqB,gBAAgB,MAArC,YAA0C,kBAAqB,mBAAmB;AAEnG,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,KAAK,qBAAqB,UAAU;AAGxD,QAAI,gBAAgB,UAAU;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,KAAK,iCAAiC,UAAU;AAEtE,QAAI,OAAO,SAAS,eAAe,YAAY;AAC7C,iCACG,eADH,kCACgB,KAAK,cADrB,mBAEI,KAAK,MAAM;AA/GrB,YAAAC;AAgHU,sBAAc,mCAA2B,EAAE,WAAW,CAAC;AACvD,SAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc,mCAA2B,EAAE,WAAW;AAAA,MACxD,OALF,mBAMI,MAAM,CAAC,UAAU;AAnH3B,YAAAA;AAoHU,sBAAc,mCAA2B,EAAE,YAAY,SAAS,MAAM,QAAQ,CAAC;AAC/E,SAAAA,MAAA,KAAK,YAAL,gBAAAA,IAAc,mCAA2B,EAAE,YAAY,SAAS,MAAM,QAAQ;AAAA,MAChF;AAAA,IACJ,OAAO;AACL,oBAAc,mCAA2B,EAAE,WAAW,CAAC;AACvD,iBAAK,YAAL,mBAAc,mCAA2B,EAAE,WAAW;AAAA,IACxD;AAEA,QAAI,YAAY;AACd,WAAK,iBAAiB,IAAI,YAAY,QAAQ;AAAA,IAChD,OAAO;AACL,WAAK,mBAAmB;AAAA,IAC1B;AAEA,SAAK,kBAAkB,aAAa,UAAU,YAAY,aAAa;AAGvE,QAAI,CAAC,CAAC,GAAG,KAAK,iBAAiB,OAAO,GAAG,KAAK,gBAAgB,EAAE,SAAS,WAAW,GAAG;AACrF,uDAAa,YAAb;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,qBAAqB,MAAkB;AA5InD;AA6II,QAAI,CAAC,MAAM;AACT,aAAO,KAAK;AAAA,IACd;AAEA,YAAO,UAAK,iBAAiB,IAAI,IAAI,MAA9B,YAAmC,KAAK;AAAA,EACjD;AAAA,EAEU,iCAAiC,MAAwC;AACjF,UAAM,UAAU,KAAK,cAAc,IAAI,IAAI;AAE3C,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,IAAI,wBAAwB,MAAM,KAAK,OAAO;AACjE,SAAK,cAAc,IAAI,MAAM,UAAU;AAEvC,UAAM,iBAAiB,KAAK,qBAAqB,IAAI;AACrD,WAAO,OAAuB,cAAc,EAAE;AAAA,MAAQ,CAAC,cAAW;AAhKtE;AAiKM,oCAAe,WAAf,mBAAuB,WAAW,WAAW,CAAO,YAA2B;AAC7E,qBAAW,KAAK,WAAW,iCAAK,UAAL,EAAc,YAAY,KAAK,EAAC;AAAA,QAC7D;AAAA;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBACN,aACA,aACA,YACA,eACA;AA9KJ;AA+KI,eAAK,qBACF,IAAI,UAAU,MADjB,mBAEI,QAAQ,CAAC,iBAAc;AAjL/B,UAAAA;AAiLkC,cAAAA,MAAA,YAAY,WAAZ,gBAAAA,IAAoB,cAAc,GAAG;AAAA;AAGnE,UAAM,oBAAoB,OAAO,OAAuB,cAAc,EAAE;AAAA,MACtE,CAAC,cAAc;AACb,cAAM,UAAU,CAAO,YAA2B;AAEhD,wBAAc,KAAK,WAAW,iCAAK,UAAL,EAAc,WAAW,EAAC;AACxD,eAAK,QAAQ,KAAK,WAAW,iCAAK,UAAL,EAAc,WAAW,EAAC;AAAA,QACzD;AAEA,eAAO,CAAC,WAAW,OAAO;AAAA,MAC5B;AAAA,IACF;AAEA,SAAK,qBAAqB,IAAI,YAAY,iBAAiB;AAC3D,sBAAkB,QAAQ,CAAC,iBAAc;AAjM7C,UAAAA;AAiMgD,cAAAA,MAAA,YAAY,WAAZ,gBAAAA,IAAoB,WAAW,GAAG;AAAA,KAAa;AAAA,EAC7F;AAAA,EAEM,QAAuB;AAAA;AApM/B;AAqMI,UAAI;AACF,eAAM,wCAAM,qBAAN,mBAAwB,YAAxB;AAAA,MACR,SAAS,KAAP;AACA,aAAK,oBAAoB,KAAK,kBAAkB,GAAG;AAAA,MACrD;AAEA,YAAM,YAAY,MAAM,KAAK,KAAK,gBAAgB;AAElD,YAAM,QAAQ;AAAA,QACZ,UAAU,IAAI,CAAO,OAAiB,eAAjB,KAAiB,WAAjB,CAAC,EAAE,QAAQ,GAAM;AA9M5C,cAAAA;AA+MQ,cAAI;AACF,mBAAMA,MAAA,SAAS,YAAT,gBAAAA,IAAA;AAAA,UACR,SAAS,KAAP;AACA,iBAAK,oBAAoB,KAAK,kBAAkB,GAAG;AAAA,UACrD;AAAA,QACF,EAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA,EAEQ,oBAAoB,UAAa,KAAc;AACrD,SAAK,QAAQ,MAAM,qCAAqC,SAAS,SAAS,SAAS,KAAK;AACxF,SAAK,QAAQ,MAAO,2BAAe,KAAK;AAAA,EAC1C;AAAA,EAEA,gCAAgC,8BAAqF;AACnH,UAAM,cAAc;AACpB,QAAI,QAAO,6EAA8B,2BAA0B,YAAY;AAC7E,WAAK,QAAQ,MAAM,GAAG,uDAAuD;AAAA,IAC/E,WAAW,QAAO,6EAA8B,2BAA0B,YAAY;AACpF,WAAK,QAAQ,MAAM,GAAG,uDAAuD;AAAA,IAC/E,OAAO;AACL,WAAK,gCAAgC;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,sBACE,oBACA,aACG,MACG;AACN,SAAK,8BAA8B,sBAAsB,oBAAoB,UAAU,GAAG,IAAI;AAAA,EAChG;AAAA,EAEA,wBAA4C;AAC1C,QAAI;AACF,aAAO,KAAK,8BAA8B,sBAAsB;AAAA,IAClE,SAAS,KAAP;AACA,YAAM,QAAQ;AACd,WAAK,QAAQ,MAAM,sCAAsC,+BAAO,mCAAmC;AACnG,WAAK,QAAQ,MAAM,+BAAO,KAAK;AAC/B,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;;;ACxPA,IAAM,eAAe;AAKrB,IAAM,sBAAN,MAA8C;AAAA,EAA9C;AACE,SAAS,WAAW;AAAA,MAClB,MAAM;AAAA,IACR;AAAA;AAAA,EAEA,IAAI,SAAyB;AAO3B;AAAA,EACF;AAAA,EAEA,yBAAyB,GAAW,cAAmD;AACrF,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,wBAAwB,GAAW,cAAiD;AAClF,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,wBAAwB,GAAW,cAAiD;AAClF,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,wBAA6C,GAAW,cAAuC;AAC7F,WAAO,KAAK,KAAQ,YAAY;AAAA,EAClC;AAAA,EAEQ,KAAQ,cAAiB;AAC/B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,IAAM,gBAAgB,IAAI,oBAAoB;;;ACzCrD,IAAM,6BAA6B,OAAO,IAAI,0BAA0B;AAKxE,IAAM,cAAc;AAEb,IAAM,iBAAN,cAA6B,qBAA+B;AAAA;AAAA,EAKzD,cAAc;AACpB,UAAM;AALR,SAAU,SAAiB,CAAC;AAC5B,SAAU,mBAA6B;AAAA,EAKvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,cAA8B;AACnC,UAAM,YAAY,YAAY,0BAA0B;AACxD,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,IAAI,eAAe;AACpC,gBAAY,0BAA0B,IAAI;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,UAAU,IAAI,WAAW,MAAM;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAAgC;AAC1C,SAAK,SAAS,CAAC,GAAG,KAAK,QAAQ,GAAG,KAAK;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,WAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAmB;AACjB,SAAK,SAAS,CAAC;AACf,WAAO;AAAA,EACT;AAAA,EAEM,WAAW,SAA2C;AAAA;AAzD9D;AA0DI,YAAM,aAAa,KAAK;AACxB,WAAK,WAAW;AAChB,aAAM,gBAAK,qBAAL,mBAAuB,oBAAvB,4BAAyC,YAAY;AAAA,IAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,UAAU,MAAe,SAA0B;AACjD,WAAO,IAAI;AAAA;AAAA;AAAA,MAGT,MAAM,KAAK,qBAAqB,IAAI;AAAA,MACpC,MAAM,KAAK,iCAAiC,IAAI;AAAA,MAChD,MAAM,KAAK;AAAA,MACX,EAAE,MAAM,QAAQ;AAAA,IAClB;AAAA,EACF;AACF;AAMO,IAAM,cAAc,eAAe,YAAY;;;AC/D/C,IAAM,oBAAN,MAA0C;AAAA,EAI/C,YAGmB,kBACA,iBACA,cACA,SACjB;AAJiB;AACA;AACA;AACA;AATnB,SAAQ,SAAiB,CAAC;AAAA,EAUvB;AAAA,EAEH,IAAI,WAA2B;AAC7B,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS,KAAK,QAAQ;AAAA,MACtB,kBAAkB,KAAK,iBAAiB,EAAE;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,WAAW,WAA2B,SAA6B;AAhDrE;AAiDI,SAAK,gBAAgB,EAAE,WAAW,WAAW,OAAO;AACpD,UAAM,gBAAgB,CAAC,KAAK,UAAU,UAAU,KAAK,UAAU;AAE/D,QAAI,8CAAsC,eAAe;AAEvD,UAAI;AACF,gBAAQ,EAAE,YAAY,KAAK,SAAS,KAAK,CAAC;AAAA,MAC5C,SAAS,KAAP;AACA,mBAAK,YAAL,mBAAc,MAAM,gCAAgC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,kBAAkC,SAA6B;AAC3E,SAAK,gBAAgB,EAAE,cAAc,kBAAkB,OAAO;AAAA,EAChE;AAAA,EAEA,YAAY,WAA2B;AACrC,WAAO,KAAK,gBAAgB,EAAE,YAAY,SAAS;AAAA,EACrD;AAAA,EAEA,UAAU,QAAmC;AAC3C,SAAK,gBAAgB,IAAI,WAAW,MAAM;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAA6C;AACvD,SAAK,SAAS,CAAC,GAAG,KAAK,QAAQ,GAAG,KAAK;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,WAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAgC;AAC9B,SAAK,SAAS,CAAC;AACf,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,SAAiB,cAAuB,SAA0C;AAChG,WAAO,KAAK,kBAAkB,SAAS,cAAc,OAAO,EAAE;AAAA,EAChE;AAAA,EAEA,kBACE,SACA,cACA,SAC4B;AAC5B,WAAO,KAAK,SAAkB,SAAS,KAAK,UAAU,0BAA0B,cAAc,WAAW,OAAO;AAAA,EAClH;AAAA,EAEA,eAA0C,SAAiB,cAAiB,SAAoC;AAC9G,WAAO,KAAK,iBAAoB,SAAS,cAAc,OAAO,EAAE;AAAA,EAClE;AAAA,EAEA,iBACE,SACA,cACA,SACsB;AACtB,WAAO,KAAK;AAAA,MACV;AAAA;AAAA,MAEA,KAAK,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAA0C,SAAiB,cAAiB,SAAoC;AAC9G,WAAO,KAAK,iBAAiB,SAAS,cAAc,OAAO,EAAE;AAAA,EAC/D;AAAA,EAEA,iBACE,SACA,cACA,SACsB;AACtB,WAAO,KAAK;AAAA,MACV;AAAA;AAAA,MAEA,KAAK,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eACE,SACA,cACA,SACG;AACH,WAAO,KAAK,iBAAiB,SAAS,cAAc,OAAO,EAAE;AAAA,EAC/D;AAAA,EAEA,iBACE,SACA,cACA,SACsB;AACtB,WAAO,KAAK,SAAY,SAAS,KAAK,UAAU,yBAAyB,cAAc,UAAU,OAAO;AAAA,EAC1G;AAAA,EAEQ,SACN,SACA,UACA,cACA,UACA,UAAiC,CAAC,GACZ;AAjK1B;AAoKI,UAAM,WAAW;AAAA,MACf,GAAG,YAAY,SAAS;AAAA,MACxB,GAAG,KAAK,SAAS;AAAA,MACjB,GAAI,QAAQ,SAAS,CAAC;AAAA,MACtB,GAAI,KAAK,UAAU,SAAS,CAAC;AAAA,IAC/B;AACA,UAAM,mBAAmB,CAAC,GAAG,QAAQ,EAAE,QAAQ;AAE/C,UAAM,UAAU,mBACX,YAAY,WAAW;AAK5B,UAAM,cAAqC;AAAA,MACzC;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,gBAAgB,KAAK;AAAA,MACrB,kBAAkB,YAAY;AAAA,MAC9B;AAAA,MACA,QAAQ,KAAK;AAAA,IACf;AAEA,QAAI;AACF,WAAK,YAAY,UAAU,aAAa,OAAO;AAG/C,YAAM,aAAa,SAAS,KAAK,KAAK,WAAW,SAAS,cAAc,SAAS,KAAK,OAAO;AAE7F,YAAM,oBAAoB,iCACrB,aADqB;AAAA,QAExB,cAAc,OAAO,QAAO,gBAAW,iBAAX,YAA2B,CAAC,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,WAAK,WAAW,kBAAkB,aAAa,mBAAmB,OAAO;AAEzE,aAAO;AAAA,IACT,SAAS,KAAP;AACA,YAAM,eAAwB,2BAAe;AAC7C,YAAM,aAAwB,2BAA0B;AAExD,WAAK,WAAW,kBAAkB,aAAa,KAAK,OAAO;AAE3D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,QAAQ,0BAA0B;AAAA,QAClC,cAAc,OAAO,OAAO,CAAC,CAAC;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,aAAa,kBAAkB,aAAa,OAAO;AAAA,IAC1D;AAAA,EACF;AAAA,EAEQ,YAAY,OAAe,aAA0B,SAAgC;AA9N/F;AA+NI,eAAW,QAAQ,OAAO;AAExB,aAAO,OAAO,WAAW;AAGzB,aAAO,OAAO,YAAY,SAAS,kCAC9B,YAAY,WACZ,kCAAM,WAAN,8BAAe,aAAa,OAAO,OAAO,QAAQ,SAAS,GAC/D;AAAA,IACH;AAGA,WAAO,OAAO,OAAO,YAAY,OAAO;AAAA,EAC1C;AAAA,EAEQ,WACN,OACA,aACA,mBACA,SACA;AAnPJ;AAqPI,eAAW,QAAQ,OAAO;AACxB,yCAAM,UAAN,8BAAc,aAAa,mBAAmB,QAAQ;AAAA,IACxD;AAAA,EACF;AAAA,EAEQ,WAAW,OAAe,aAA0B,KAAc,SAAgC;AA1P5G;AA4PI,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,2CAAM,UAAN,8BAAc,aAAa,KAAK,QAAQ;AAAA,MAC1C,SAASC,MAAP;AACA,aAAK,QAAQ,MAAM,wCAAwCA,MAAK;AAChE,YAAIA,gBAAe,OAAO;AACxB,eAAK,QAAQ,MAAMA,KAAI,KAAK;AAAA,QAC9B;AACA,aAAK,QAAQ,MAAOA,QAAA,gBAAAA,KAAe,KAAK;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa,OAAe,aAA0B,SAAgC;AAzQhG;AA2QI,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,2CAAM,YAAN,8BAAgB,aAAa,QAAQ;AAAA,MACvC,SAAS,KAAP;AACA,aAAK,QAAQ,MAAM,0CAA0C,KAAK;AAClE,YAAI,eAAe,OAAO;AACxB,eAAK,QAAQ,MAAM,IAAI,KAAK;AAAA,QAC9B;AACA,aAAK,QAAQ,MAAO,2BAAe,KAAK;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAY,YAAsB;AAChC,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AAAA,EAEA,IAAY,UAAU;AACpB,WAAO,KAAK,iBAAiB,KAAK,aAAa;AAAA,EACjD;AACF;",
6
6
  "names": ["module", "ReflectApply", "ReflectOwnKeys", "NumberIsNaN", "EventEmitter", "once", "ErrorCode", "ProviderStatus", "ProviderEvents", "EventEmitter", "_a", "err"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -695,6 +695,7 @@ var OpenFeatureCommonAPI = class {
695
695
  this._context = {};
696
696
  this._logger = new DefaultLogger();
697
697
  this._events = new OpenFeatureEventEmitter(() => this._logger);
698
+ this._clientEventHandlers = /* @__PURE__ */ new Map();
698
699
  this._clientProviders = /* @__PURE__ */ new Map();
699
700
  this._clientEvents = /* @__PURE__ */ new Map();
700
701
  }
@@ -749,7 +750,7 @@ var OpenFeatureCommonAPI = class {
749
750
  if (oldProvider === provider) {
750
751
  return this;
751
752
  }
752
- const clientEmitter = this.getEventEmitterForClient(clientName);
753
+ const clientEmitter = this.getAndCacheEventEmitterForClient(clientName);
753
754
  if (typeof provider.initialize === "function") {
754
755
  (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
755
756
  var _a2;
@@ -782,27 +783,44 @@ var OpenFeatureCommonAPI = class {
782
783
  }
783
784
  return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
784
785
  }
785
- getEventEmitterForClient(name) {
786
+ getAndCacheEventEmitterForClient(name) {
786
787
  const emitter = this._clientEvents.get(name);
787
788
  if (emitter) {
788
789
  return emitter;
789
790
  }
790
791
  const newEmitter = new OpenFeatureEventEmitter(() => this._logger);
791
792
  this._clientEvents.set(name, newEmitter);
793
+ const clientProvider = this.getProviderForClient(name);
794
+ Object.values(ProviderEvents).forEach(
795
+ (eventType) => {
796
+ var _a;
797
+ return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
798
+ newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name }));
799
+ }));
800
+ }
801
+ );
792
802
  return newEmitter;
793
803
  }
794
804
  transferListeners(oldProvider, newProvider, clientName, clientEmitter) {
795
805
  var _a;
796
- (_a = oldProvider.events) == null ? void 0 : _a.removeAllHandlers();
797
- Object.values(ProviderEvents).forEach(
806
+ (_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
807
+ var _a2;
808
+ return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
809
+ });
810
+ const newClientHandlers = Object.values(ProviderEvents).map(
798
811
  (eventType) => {
799
- var _a2;
800
- return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(eventType, (details) => __async(this, null, function* () {
812
+ const handler = (details) => __async(this, null, function* () {
801
813
  clientEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName }));
802
814
  this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName }));
803
- }));
815
+ });
816
+ return [eventType, handler];
804
817
  }
805
818
  );
819
+ this._clientEventHandlers.set(clientName, newClientHandlers);
820
+ newClientHandlers.forEach((eventHandler) => {
821
+ var _a2;
822
+ return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
823
+ });
806
824
  }
807
825
  close() {
808
826
  return __async(this, null, function* () {
@@ -950,7 +968,7 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
950
968
  // functions are passed here to make sure that these values are always up to date,
951
969
  // and so we don't have to make these public properties on the API class.
952
970
  () => this.getProviderForClient(name),
953
- () => this.getEventEmitterForClient(name),
971
+ () => this.getAndCacheEventEmitterForClient(name),
954
972
  () => this._logger,
955
973
  { name, version }
956
974
  );
@@ -960,9 +978,9 @@ var OpenFeature = OpenFeatureAPI.getInstance();
960
978
 
961
979
  // src/client.ts
962
980
  var OpenFeatureClient = class {
963
- constructor(providerAccessor, events, globalLogger, options) {
981
+ constructor(providerAccessor, emitterAccessor, globalLogger, options) {
964
982
  this.providerAccessor = providerAccessor;
965
- this.events = events;
983
+ this.emitterAccessor = emitterAccessor;
966
984
  this.globalLogger = globalLogger;
967
985
  this.options = options;
968
986
  this._hooks = [];
@@ -975,17 +993,22 @@ var OpenFeatureClient = class {
975
993
  };
976
994
  }
977
995
  addHandler(eventType, handler) {
978
- this.events().addHandler(eventType, handler);
996
+ var _a;
997
+ this.emitterAccessor().addHandler(eventType, handler);
979
998
  const providerReady = !this._provider.status || this._provider.status === "READY" /* READY */;
980
999
  if (eventType === "PROVIDER_READY" /* Ready */ && providerReady) {
981
- handler({ clientName: this.metadata.name });
1000
+ try {
1001
+ handler({ clientName: this.metadata.name });
1002
+ } catch (err) {
1003
+ (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
1004
+ }
982
1005
  }
983
1006
  }
984
1007
  removeHandler(notificationType, handler) {
985
- this.events().removeHandler(notificationType, handler);
1008
+ this.emitterAccessor().removeHandler(notificationType, handler);
986
1009
  }
987
1010
  getHandlers(eventType) {
988
- return this.events().getHandlers(eventType);
1011
+ return this.emitterAccessor().getHandlers(eventType);
989
1012
  }
990
1013
  setLogger(logger) {
991
1014
  this._clientLogger = new SafeLogger(logger);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../node_modules/events/events.js", "../../../shared/src/types.ts", "../../../shared/src/errors/open-feature-error-abstract.ts", "../../../shared/src/errors/general-error.ts", "../../../shared/src/errors/flag-not-found-error.ts", "../../../shared/src/errors/parse-error.ts", "../../../shared/src/errors/type-mismatch-error.ts", "../../../shared/src/errors/targeting-key-missing-error.ts", "../../../shared/src/errors/invalid-context-error.ts", "../../../shared/src/logger.ts", "../../../shared/src/no-op-transaction-context-propagator.ts", "../../../shared/src/events.ts", "../../../shared/src/type-guards.ts", "../../../shared/src/open-feature.ts", "../../src/no-op-provider.ts", "../../src/open-feature.ts", "../../src/client.ts"],
4
- "sourcesContent": ["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n", "import { OpenFeatureEventEmitter } from './events';\n\nexport type PrimitiveValue = null | boolean | string | number;\n\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type JsonArray = JsonValue[];\n\n/**\n * Represents a JSON node value.\n */\nexport type JsonValue = PrimitiveValue | JsonObject | JsonArray;\n\n/**\n * Represents a JSON node value, or Date.\n */\nexport type EvaluationContextValue =\n | PrimitiveValue\n | Date\n | { [key: string]: EvaluationContextValue }\n | EvaluationContextValue[];\n\n/**\n * A container for arbitrary contextual data that can be used as a basis for dynamic evaluation\n */\nexport type EvaluationContext = {\n /**\n * A string uniquely identifying the subject (end-user, or client service) of a flag evaluation.\n * Providers may require this field for fractional flag evaluation, rules, or overrides targeting specific users.\n * Such providers may behave unpredictably if a targeting key is not specified at flag resolution.\n */\n targetingKey?: string;\n} & Record<string, EvaluationContextValue>;\n\nexport type FlagValue = boolean | string | number | JsonValue;\n\nexport type FlagValueType = 'boolean' | 'string' | 'number' | 'object';\n\nexport interface Logger {\n error(...args: unknown[]): void;\n\n warn(...args: unknown[]): void;\n\n info(...args: unknown[]): void;\n\n debug(...args: unknown[]): void;\n}\n\nexport const StandardResolutionReasons = {\n /**\n * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.\n */\n TARGETING_MATCH: 'TARGETING_MATCH',\n\n /**\n * The resolved value was the result of pseudorandom assignment.\n */\n SPLIT: 'SPLIT',\n\n /**\n * The resolved value was the result of the flag being disabled in the management system.\n */\n DISABLED: 'DISABLED',\n\n /**\n * The resolved value was configured statically, or otherwise fell back to a pre-configured value.\n */\n DEFAULT: 'DEFAULT',\n\n /**\n * The reason for the resolved value could not be determined.\n */\n UNKNOWN: 'UNKNOWN',\n\n /**\n * The resolved value is static (no dynamic evaluation).\n */\n STATIC: 'STATIC',\n\n /**\n * The resolved value was retrieved from cache.\n */\n CACHED: 'CACHED',\n\n /**\n * The resolved value was the result of an error.\n *\n * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.\n */\n ERROR: 'ERROR',\n} as const;\n\nexport enum ErrorCode {\n /**\n * The value was resolved before the provider was ready.\n */\n PROVIDER_NOT_READY = 'PROVIDER_NOT_READY',\n\n /**\n * The flag could not be found.\n */\n FLAG_NOT_FOUND = 'FLAG_NOT_FOUND',\n\n /**\n * An error was encountered parsing data, such as a flag configuration.\n */\n PARSE_ERROR = 'PARSE_ERROR',\n\n /**\n * The type of the flag value does not match the expected type.\n */\n TYPE_MISMATCH = 'TYPE_MISMATCH',\n\n /**\n * The provider requires a targeting key and one was not provided in the evaluation context.\n */\n TARGETING_KEY_MISSING = 'TARGETING_KEY_MISSING',\n\n /**\n * The evaluation context does not meet provider requirements.\n */\n INVALID_CONTEXT = 'INVALID_CONTEXT',\n\n /**\n * An error with an unspecified code.\n */\n GENERAL = 'GENERAL',\n}\n\nexport type ResolutionReason = keyof typeof StandardResolutionReasons | (string & Record<never, never>);\n\n/**\n * A structure which supports definition of arbitrary properties, with keys of type string, and values of type boolean, string, or number.\n *\n * This structure is populated by a provider for use by an Application Author (via the Evaluation API) or an Application Integrator (via hooks).\n */\nexport type FlagMetadata = Record<string, string | number | boolean>;\n\nexport type ResolutionDetails<U> = {\n value: U;\n variant?: string;\n flagMetadata?: FlagMetadata;\n reason?: ResolutionReason;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport type EvaluationDetails<T extends FlagValue> = {\n flagKey: string;\n flagMetadata: Readonly<FlagMetadata>;\n} & ResolutionDetails<T>;\n\nexport interface ManageContext<T> {\n /**\n * Access the evaluation context set on the receiver.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n\n /**\n * Sets evaluation context that will be used during flag evaluations\n * on this receiver.\n * @template T The type of the receiver\n * @param {EvaluationContext} context Evaluation context\n * @returns {T} The receiver (this object)\n */\n setContext(context: EvaluationContext): T;\n}\n\nexport interface ManageLogger<T> {\n /**\n * Sets a logger on this receiver. This logger supersedes to the global logger\n * and is passed to various components in the SDK.\n * The logger configured on the global API object will be used for all evaluations,\n * unless overridden in a particular client.\n * @template T The type of the receiver\n * @param {Logger} logger The logger to be used\n * @returns {T} The receiver (this object)\n */\n setLogger(logger: Logger): T;\n}\n\nexport type HookHints = Readonly<Record<string, unknown>>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface Metadata {}\n\nexport interface ClientMetadata extends Metadata {\n readonly version?: string;\n readonly name?: string;\n readonly providerMetadata: ProviderMetadata;\n}\n\nexport interface ProviderMetadata extends Metadata {\n readonly name: string;\n}\n\nexport interface HookContext<T extends FlagValue = FlagValue> {\n readonly flagKey: string;\n readonly defaultValue: T;\n readonly flagValueType: FlagValueType;\n readonly context: Readonly<EvaluationContext>;\n readonly clientMetadata: ClientMetadata;\n readonly providerMetadata: ProviderMetadata;\n readonly logger: Logger;\n}\n\nexport interface BeforeHookContext extends HookContext {\n context: EvaluationContext;\n}\n\n/**\n * Transaction context is a mechanism for adding transaction specific context that\n * is merged with evaluation context prior to flag evaluation. Examples of potential\n * transaction specific context include: a user id, user agent, or request path.\n */\nexport type TransactionContext = EvaluationContext;\n\nexport interface ManageTransactionContextPropagator<T> extends TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets a transaction context propagator on this receiver. The transaction context\n * propagator is responsible for persisting context for the duration of a single\n * transaction.\n * @experimental\n * @template T The type of the receiver\n * @param {TransactionContextPropagator} transactionContextPropagator The context propagator to be used\n * @returns {T} The receiver (this object)\n */\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): T;\n}\n\nexport interface TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Returns the currently defined transaction context using the registered transaction\n * context propagator.\n * @experimental\n * @returns {TransactionContext} The current transaction context\n */\n getTransactionContext(): TransactionContext;\n\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets the transaction context using the registered transaction context propagator.\n * @experimental\n * @template R The return value of the callback\n * @param {TransactionContext} transactionContext The transaction specific context\n * @param {(...args: unknown[]) => R} callback Callback function used to set the transaction context on the stack\n * @param {...unknown[]} args Optional arguments that are passed to the callback function\n */\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void;\n}\n\nexport enum ProviderStatus {\n NOT_READY = 'NOT_READY',\n READY = 'READY',\n ERROR = 'ERROR',\n}\n\nexport interface CommonProvider {\n readonly metadata: ProviderMetadata;\n readonly status?: ProviderStatus;\n\n /**\n * An event emitter for ProviderEvents.\n * @see ProviderEvents\n */\n events?: OpenFeatureEventEmitter;\n\n onClose?(): Promise<void>;\n\n /**\n * A handler function used to setup the provider.\n * Called by the SDK after the provider is set.\n * When the returned promise resolves, the SDK fires the ProviderEvents.Ready event.\n * If the returned promise rejects, the SDK fires the ProviderEvents.Error event.\n * Use this function to perform any context-dependent setup within the provider.\n * @param context\n */\n initialize?(context?: EvaluationContext): Promise<void>;\n}\n", "import { ErrorCode } from '../types';\n\nexport abstract class OpenFeatureError extends Error {\n abstract code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, OpenFeatureError.prototype);\n this.name = 'OpenFeatureError';\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class GeneralError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, GeneralError.prototype);\n this.name = 'GeneralError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class FlagNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, FlagNotFoundError.prototype);\n this.name = 'FlagNotFoundError';\n this.code = ErrorCode.FLAG_NOT_FOUND;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class ParseError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, ParseError.prototype);\n this.name = 'ParseError';\n this.code = ErrorCode.PARSE_ERROR;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TypeMismatchError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TypeMismatchError.prototype);\n this.name = 'TypeMismatchError';\n this.code = ErrorCode.TYPE_MISMATCH;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TargetingKeyMissingError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);\n this.name = 'TargetingKeyMissingError';\n this.code = ErrorCode.TARGETING_KEY_MISSING;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class InvalidContextError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, InvalidContextError.prototype);\n this.name = 'InvalidContextError';\n this.code = ErrorCode.INVALID_CONTEXT;\n }\n}\n", "/* eslint-disable @typescript-eslint/no-empty-function */\nimport { Logger } from './types';\n\nconst LOG_LEVELS: Array<keyof Logger> = ['error', 'warn', 'info', 'debug'];\nexport class DefaultLogger implements Logger {\n error(...args: unknown[]): void {\n console.error(...args);\n }\n warn(...args: unknown[]): void {\n console.warn(...args);\n }\n info(): void {}\n debug(): void {}\n}\n\nexport class SafeLogger implements Logger {\n private readonly logger: Logger;\n private readonly fallbackLogger = new DefaultLogger();\n\n constructor(logger: Logger) {\n try {\n for (const level of LOG_LEVELS) {\n if (!logger[level] || typeof logger[level] !== 'function') {\n throw new Error(`The provided logger is missing the ${level} method.`);\n }\n }\n this.logger = logger;\n } catch (err) {\n console.error(err);\n console.error('Falling back to the default logger.');\n this.logger = this.fallbackLogger;\n }\n }\n\n error(...args: unknown[]): void {\n this.log('error', ...args);\n }\n warn(...args: unknown[]): void {\n this.log('warn', ...args);\n }\n info(...args: unknown[]): void {\n this.log('info', ...args);\n }\n debug(...args: unknown[]): void {\n this.log('debug', ...args);\n }\n\n private log(level: keyof Logger, ...args: unknown[]) {\n try {\n this.logger[level](...args);\n } catch (error) {\n this.fallbackLogger[level](...args);\n }\n }\n}\n", "import { EvaluationContext, TransactionContextPropagator } from './types';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext(_: EvaluationContext, callback: () => void): void {\n callback();\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import { Logger, ManageLogger } from './types';\nimport EventEmitter from 'events';\nimport { SafeLogger } from './logger';\n\nexport type EventMetadata = {\n [key: string]: string | boolean | number;\n};\n\nexport type EventDetails = {\n clientName?: string;\n message?: string;\n flagsChanged?: string[];\n metadata?: EventMetadata;\n};\n\nexport type EventHandler = (eventDetails?: EventDetails) => Promise<unknown> | unknown;\n\nexport interface Eventing {\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * @param {ProviderEvents} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n */\n addHandler(eventType: ProviderEvents, handler: EventHandler): void;\n\n /**\n * Removes a handler for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void;\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers(eventType: ProviderEvents): EventHandler[];\n}\n\nexport enum ProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n\n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n Stale = 'PROVIDER_STALE',\n}\n\nexport class OpenFeatureEventEmitter implements ManageLogger<OpenFeatureEventEmitter> {\n private readonly _handlers = new WeakMap<EventHandler, EventHandler>();\n private readonly eventEmitter = new EventEmitter({ captureRejections: true });\n private _eventLogger?: Logger;\n\n constructor(private readonly globalLogger?: () => Logger) {\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n\n emit(eventType: ProviderEvents, context?: EventDetails): void {\n this.eventEmitter.emit(eventType, context);\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n // The handlers have to be wrapped with an async function because if a synchronous functions throws an error,\n // the other handlers will not run.\n const asyncHandler = async (context?: EventDetails) => {\n await handler(context);\n };\n // The async handler has to be written to the map, because we need to get the wrapper function when deleting a listener\n this._handlers.set(handler, asyncHandler);\n this.eventEmitter.on(eventType, asyncHandler);\n }\n\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void {\n // Get the wrapper function for this handler, to delete it from the event emitter\n const asyncHandler = this._handlers.get(handler);\n\n if (!asyncHandler) {\n return;\n }\n\n this.eventEmitter.removeListener(eventType, asyncHandler);\n }\n\n removeAllHandlers(eventType?: ProviderEvents): void {\n // If giving undefined, the listeners are not removed, so we have to check explicitly\n if (eventType) {\n this.eventEmitter.removeAllListeners(eventType);\n } else {\n this.eventEmitter.removeAllListeners();\n }\n }\n\n getHandlers(eventType: ProviderEvents): EventHandler[] {\n return this.eventEmitter.listeners(eventType) as EventHandler[];\n }\n\n setLogger(logger: Logger): this {\n this._eventLogger = new SafeLogger(logger);\n return this;\n }\n\n private get _logger() {\n return this._eventLogger || this.globalLogger?.();\n }\n}\n", "/**\n * Checks whether the parameter is a string.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Returns the parameter if it is a string, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {string|undefined} The parameter if it is a string, otherwise undefined\n */\nexport function stringOrUndefined(value: unknown): string | undefined {\n return isString(value) ? value : undefined;\n}\n\n/**\n * Checks whether the parameter is an object.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is an object\n */\nexport function isObject<T extends object>(value: unknown): value is T {\n return typeof value === 'object';\n}\n\n/**\n * Returns the parameter if it is an object, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {object|undefined} The parameter if it is an object, otherwise undefined\n */\nexport function objectOrUndefined<T extends object>(value: unknown): T | undefined {\n return isObject<T>(value) ? value : undefined;\n}\n", "import { DefaultLogger, SafeLogger } from './logger';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } from './no-op-transaction-context-propagator';\nimport {\n CommonProvider,\n EvaluationContext,\n Logger,\n ProviderMetadata,\n TransactionContext,\n TransactionContextPropagator,\n} from './types';\nimport { EventDetails, EventHandler, Eventing, OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport { objectOrUndefined, stringOrUndefined } from './type-guards';\n\nexport abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProvider> implements Eventing {\n protected _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n protected _context: EvaluationContext = {};\n protected _logger: Logger = new DefaultLogger();\n\n protected abstract _defaultProvider: P;\n\n private readonly _events = new OpenFeatureEventEmitter(() => this._logger);\n protected _clientProviders: Map<string, P> = new Map();\n protected _clientEvents: Map<string | undefined, OpenFeatureEventEmitter> = new Map();\n\n abstract clearHooks(): this;\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n /**\n * Get metadata about registered provider.\n * @returns {ProviderMetadata} Provider Metadata\n */\n get providerMetadata(): ProviderMetadata {\n return this._defaultProvider.metadata;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * When changing the provider, the currently attached handlers will listen to the events of the new provider.\n * @param {ProviderEvents} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n */\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this._events.addHandler(eventType, handler);\n }\n\n /**\n * Removes a handler for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this._events.removeHandler(eventType, handler);\n }\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers(eventType: ProviderEvents): EventHandler[] {\n return this._events.getHandlers(eventType);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by unnamed clients and named clients to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing clients without a name.\n * @template P\n * @param {P} provider The provider responsible for flag evaluations.\n * @returns {OpenFeatureCommonAPI} OpenFeature API\n */\n setProvider(provider: P): this;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients with that name.\n * @template P\n * @param {string} clientName The name to identify the client\n * @param {P} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(clientName: string, provider: P): this;\n setProvider(clientOrProvider?: string | P, providerOrUndefined?: P): this {\n const clientName = stringOrUndefined(clientOrProvider);\n const provider = objectOrUndefined<P>(clientOrProvider) ?? objectOrUndefined<P>(providerOrUndefined);\n\n if (!provider) {\n return this;\n }\n\n const oldProvider = this.getProviderForClient(clientName);\n\n // ignore no-ops\n if (oldProvider === provider) {\n return this;\n }\n\n const clientEmitter = this.getEventEmitterForClient(clientName);\n\n if (typeof provider.initialize === 'function') {\n provider\n .initialize?.(this._context)\n ?.then(() => {\n clientEmitter.emit(ProviderEvents.Ready, { clientName });\n this._events?.emit(ProviderEvents.Ready, { clientName });\n })\n ?.catch((error) => {\n clientEmitter.emit(ProviderEvents.Error, { clientName, message: error.message });\n this._events?.emit(ProviderEvents.Error, { clientName, message: error.message });\n });\n } else {\n clientEmitter.emit(ProviderEvents.Ready, { clientName });\n this._events?.emit(ProviderEvents.Ready, { clientName });\n }\n\n if (clientName) {\n this._clientProviders.set(clientName, provider);\n } else {\n this._defaultProvider = provider;\n }\n\n this.transferListeners(oldProvider, provider, clientName, clientEmitter);\n\n // Do not close a provider that is bound to any client\n if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {\n oldProvider?.onClose?.();\n }\n\n return this;\n }\n\n protected getProviderForClient(name?: string): P {\n if (!name) {\n return this._defaultProvider;\n }\n\n return this._clientProviders.get(name) ?? this._defaultProvider;\n }\n\n protected getEventEmitterForClient(name?: string): OpenFeatureEventEmitter {\n const emitter = this._clientEvents.get(name);\n\n if (emitter) {\n return emitter;\n }\n\n const newEmitter = new OpenFeatureEventEmitter(() => this._logger);\n this._clientEvents.set(name, newEmitter);\n return newEmitter;\n }\n\n private transferListeners(\n oldProvider: P,\n newProvider: P,\n clientName: string | undefined,\n clientEmitter: OpenFeatureEventEmitter\n ) {\n oldProvider.events?.removeAllHandlers();\n\n // iterate over the event types\n Object.values<ProviderEvents>(ProviderEvents).forEach((eventType) =>\n newProvider.events?.addHandler(eventType, async (details?: EventDetails) => {\n // on each event type, fire the associated handlers\n clientEmitter.emit(eventType, { ...details, clientName });\n this._events.emit(eventType, { ...details, clientName });\n })\n );\n }\n\n async close(): Promise<void> {\n try {\n await this?._defaultProvider?.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider, err);\n }\n\n const providers = Array.from(this._clientProviders);\n\n await Promise.all(\n providers.map(async ([, provider]) => {\n try {\n await provider.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider, err);\n }\n })\n );\n }\n\n private handleShutdownError(provider: P, err: unknown) {\n this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);\n this._logger.error((err as Error)?.stack);\n }\n\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): OpenFeatureCommonAPI<P> {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}\n", "import { JsonValue, ProviderStatus, ResolutionDetails } from '@openfeature/shared';\nimport { Provider } from './types';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n get status(): ProviderStatus {\n /**\n * This is due to the NoopProvider not being a real provider.\n * We do not want it to trigger the Ready event handlers, so we never set this to ready.\n * With the NoopProvider assigned, the client can be assumed to be uninitialized.\n * https://github.com/open-feature/js-sdk/pull/429#discussion_r1202642654\n */\n return ProviderStatus.NOT_READY;\n }\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import { EvaluationContext, FlagValue, Logger, OpenFeatureCommonAPI, SafeLogger } from '@openfeature/shared';\nimport { OpenFeatureClient } from './client';\nimport { NOOP_PROVIDER } from './no-op-provider';\nimport { Client, Hook, Provider } from './types';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider> {\n protected _hooks: Hook[] = [];\n protected _defaultProvider: Provider = NOOP_PROVIDER;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {\n super();\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n async setContext(context: EvaluationContext): Promise<void> {\n const oldContext = this._context;\n this._context = context;\n await this._defaultProvider?.onContextChange?.(oldContext, context);\n }\n\n /**\n * A factory function for creating new named OpenFeature clients. Clients can contain\n * their own state (e.g. logger, hook, context). Multiple clients can be used\n * to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} name The name of the client\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(name?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(name),\n () => this.getEventEmitterForClient(name),\n () => this._logger,\n { name, version }\n );\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import {\n ClientMetadata,\n ErrorCode,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n OpenFeatureError,\n OpenFeatureEventEmitter,\n ProviderEvents,\n ProviderStatus,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n} from '@openfeature/shared';\nimport { OpenFeature } from './open-feature';\nimport { Client, FlagEvaluationOptions, Hook, Provider } from './types';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\n\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly events: () => OpenFeatureEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n name: this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.events().addHandler(eventType, handler);\n const providerReady = !this._provider.status || this._provider.status === ProviderStatus.READY;\n\n if (eventType === ProviderEvents.Ready && providerReady) {\n // run immediately, we're ready.\n handler({ clientName: this.metadata.name });\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler) {\n this.events().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.events().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {}\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...OpenFeature.getHooks(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...OpenFeature.getContext(),\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: OpenFeature.providerMetadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze({}),\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n for (const hook of hooks) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n // use Object.assign to avoid modification of frozen hookContext\n Object.assign(hookContext.context, {\n ...hookContext.context,\n ...hook?.before?.(hookContext, Object.freeze(options.hookHints)),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n", "import { OpenFeatureEventEmitter } from './events';\n\nexport type PrimitiveValue = null | boolean | string | number;\n\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type JsonArray = JsonValue[];\n\n/**\n * Represents a JSON node value.\n */\nexport type JsonValue = PrimitiveValue | JsonObject | JsonArray;\n\n/**\n * Represents a JSON node value, or Date.\n */\nexport type EvaluationContextValue =\n | PrimitiveValue\n | Date\n | { [key: string]: EvaluationContextValue }\n | EvaluationContextValue[];\n\n/**\n * A container for arbitrary contextual data that can be used as a basis for dynamic evaluation\n */\nexport type EvaluationContext = {\n /**\n * A string uniquely identifying the subject (end-user, or client service) of a flag evaluation.\n * Providers may require this field for fractional flag evaluation, rules, or overrides targeting specific users.\n * Such providers may behave unpredictably if a targeting key is not specified at flag resolution.\n */\n targetingKey?: string;\n} & Record<string, EvaluationContextValue>;\n\nexport type FlagValue = boolean | string | number | JsonValue;\n\nexport type FlagValueType = 'boolean' | 'string' | 'number' | 'object';\n\nexport interface Logger {\n error(...args: unknown[]): void;\n\n warn(...args: unknown[]): void;\n\n info(...args: unknown[]): void;\n\n debug(...args: unknown[]): void;\n}\n\nexport const StandardResolutionReasons = {\n /**\n * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.\n */\n TARGETING_MATCH: 'TARGETING_MATCH',\n\n /**\n * The resolved value was the result of pseudorandom assignment.\n */\n SPLIT: 'SPLIT',\n\n /**\n * The resolved value was the result of the flag being disabled in the management system.\n */\n DISABLED: 'DISABLED',\n\n /**\n * The resolved value was configured statically, or otherwise fell back to a pre-configured value.\n */\n DEFAULT: 'DEFAULT',\n\n /**\n * The reason for the resolved value could not be determined.\n */\n UNKNOWN: 'UNKNOWN',\n\n /**\n * The resolved value is static (no dynamic evaluation).\n */\n STATIC: 'STATIC',\n\n /**\n * The resolved value was retrieved from cache.\n */\n CACHED: 'CACHED',\n\n /**\n * The resolved value was the result of an error.\n *\n * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.\n */\n ERROR: 'ERROR',\n} as const;\n\nexport enum ErrorCode {\n /**\n * The value was resolved before the provider was ready.\n */\n PROVIDER_NOT_READY = 'PROVIDER_NOT_READY',\n\n /**\n * The flag could not be found.\n */\n FLAG_NOT_FOUND = 'FLAG_NOT_FOUND',\n\n /**\n * An error was encountered parsing data, such as a flag configuration.\n */\n PARSE_ERROR = 'PARSE_ERROR',\n\n /**\n * The type of the flag value does not match the expected type.\n */\n TYPE_MISMATCH = 'TYPE_MISMATCH',\n\n /**\n * The provider requires a targeting key and one was not provided in the evaluation context.\n */\n TARGETING_KEY_MISSING = 'TARGETING_KEY_MISSING',\n\n /**\n * The evaluation context does not meet provider requirements.\n */\n INVALID_CONTEXT = 'INVALID_CONTEXT',\n\n /**\n * An error with an unspecified code.\n */\n GENERAL = 'GENERAL',\n}\n\nexport type ResolutionReason = keyof typeof StandardResolutionReasons | (string & Record<never, never>);\n\n/**\n * A structure which supports definition of arbitrary properties, with keys of type string, and values of type boolean, string, or number.\n *\n * This structure is populated by a provider for use by an Application Author (via the Evaluation API) or an Application Integrator (via hooks).\n */\nexport type FlagMetadata = Record<string, string | number | boolean>;\n\nexport type ResolutionDetails<U> = {\n value: U;\n variant?: string;\n flagMetadata?: FlagMetadata;\n reason?: ResolutionReason;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport type EvaluationDetails<T extends FlagValue> = {\n flagKey: string;\n flagMetadata: Readonly<FlagMetadata>;\n} & ResolutionDetails<T>;\n\nexport interface ManageContext<T> {\n /**\n * Access the evaluation context set on the receiver.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n\n /**\n * Sets evaluation context that will be used during flag evaluations\n * on this receiver.\n * @template T The type of the receiver\n * @param {EvaluationContext} context Evaluation context\n * @returns {T} The receiver (this object)\n */\n setContext(context: EvaluationContext): T;\n}\n\nexport interface ManageLogger<T> {\n /**\n * Sets a logger on this receiver. This logger supersedes to the global logger\n * and is passed to various components in the SDK.\n * The logger configured on the global API object will be used for all evaluations,\n * unless overridden in a particular client.\n * @template T The type of the receiver\n * @param {Logger} logger The logger to be used\n * @returns {T} The receiver (this object)\n */\n setLogger(logger: Logger): T;\n}\n\nexport type HookHints = Readonly<Record<string, unknown>>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface Metadata {}\n\nexport interface ClientMetadata extends Metadata {\n readonly version?: string;\n readonly name?: string;\n readonly providerMetadata: ProviderMetadata;\n}\n\nexport interface ProviderMetadata extends Metadata {\n readonly name: string;\n}\n\nexport interface HookContext<T extends FlagValue = FlagValue> {\n readonly flagKey: string;\n readonly defaultValue: T;\n readonly flagValueType: FlagValueType;\n readonly context: Readonly<EvaluationContext>;\n readonly clientMetadata: ClientMetadata;\n readonly providerMetadata: ProviderMetadata;\n readonly logger: Logger;\n}\n\nexport interface BeforeHookContext extends HookContext {\n context: EvaluationContext;\n}\n\n/**\n * Transaction context is a mechanism for adding transaction specific context that\n * is merged with evaluation context prior to flag evaluation. Examples of potential\n * transaction specific context include: a user id, user agent, or request path.\n */\nexport type TransactionContext = EvaluationContext;\n\nexport interface ManageTransactionContextPropagator<T> extends TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets a transaction context propagator on this receiver. The transaction context\n * propagator is responsible for persisting context for the duration of a single\n * transaction.\n * @experimental\n * @template T The type of the receiver\n * @param {TransactionContextPropagator} transactionContextPropagator The context propagator to be used\n * @returns {T} The receiver (this object)\n */\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): T;\n}\n\nexport interface TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Returns the currently defined transaction context using the registered transaction\n * context propagator.\n * @experimental\n * @returns {TransactionContext} The current transaction context\n */\n getTransactionContext(): TransactionContext;\n\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets the transaction context using the registered transaction context propagator.\n * @experimental\n * @template R The return value of the callback\n * @param {TransactionContext} transactionContext The transaction specific context\n * @param {(...args: unknown[]) => R} callback Callback function used to set the transaction context on the stack\n * @param {...unknown[]} args Optional arguments that are passed to the callback function\n */\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void;\n}\n\nexport enum ProviderStatus {\n NOT_READY = 'NOT_READY',\n READY = 'READY',\n ERROR = 'ERROR',\n}\n\nexport interface CommonProvider {\n readonly metadata: ProviderMetadata;\n readonly status?: ProviderStatus;\n\n /**\n * An event emitter for ProviderEvents.\n * @see ProviderEvents\n */\n events?: OpenFeatureEventEmitter;\n\n onClose?(): Promise<void>;\n\n /**\n * A handler function used to setup the provider.\n * Called by the SDK after the provider is set.\n * When the returned promise resolves, the SDK fires the ProviderEvents.Ready event.\n * If the returned promise rejects, the SDK fires the ProviderEvents.Error event.\n * Use this function to perform any context-dependent setup within the provider.\n * @param context\n */\n initialize?(context?: EvaluationContext): Promise<void>;\n}\n", "import { ErrorCode } from '../types';\n\nexport abstract class OpenFeatureError extends Error {\n abstract code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, OpenFeatureError.prototype);\n this.name = 'OpenFeatureError';\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class GeneralError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, GeneralError.prototype);\n this.name = 'GeneralError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class FlagNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, FlagNotFoundError.prototype);\n this.name = 'FlagNotFoundError';\n this.code = ErrorCode.FLAG_NOT_FOUND;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class ParseError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, ParseError.prototype);\n this.name = 'ParseError';\n this.code = ErrorCode.PARSE_ERROR;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TypeMismatchError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TypeMismatchError.prototype);\n this.name = 'TypeMismatchError';\n this.code = ErrorCode.TYPE_MISMATCH;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TargetingKeyMissingError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);\n this.name = 'TargetingKeyMissingError';\n this.code = ErrorCode.TARGETING_KEY_MISSING;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class InvalidContextError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, InvalidContextError.prototype);\n this.name = 'InvalidContextError';\n this.code = ErrorCode.INVALID_CONTEXT;\n }\n}\n", "/* eslint-disable @typescript-eslint/no-empty-function */\nimport { Logger } from './types';\n\nconst LOG_LEVELS: Array<keyof Logger> = ['error', 'warn', 'info', 'debug'];\nexport class DefaultLogger implements Logger {\n error(...args: unknown[]): void {\n console.error(...args);\n }\n warn(...args: unknown[]): void {\n console.warn(...args);\n }\n info(): void {}\n debug(): void {}\n}\n\nexport class SafeLogger implements Logger {\n private readonly logger: Logger;\n private readonly fallbackLogger = new DefaultLogger();\n\n constructor(logger: Logger) {\n try {\n for (const level of LOG_LEVELS) {\n if (!logger[level] || typeof logger[level] !== 'function') {\n throw new Error(`The provided logger is missing the ${level} method.`);\n }\n }\n this.logger = logger;\n } catch (err) {\n console.error(err);\n console.error('Falling back to the default logger.');\n this.logger = this.fallbackLogger;\n }\n }\n\n error(...args: unknown[]): void {\n this.log('error', ...args);\n }\n warn(...args: unknown[]): void {\n this.log('warn', ...args);\n }\n info(...args: unknown[]): void {\n this.log('info', ...args);\n }\n debug(...args: unknown[]): void {\n this.log('debug', ...args);\n }\n\n private log(level: keyof Logger, ...args: unknown[]) {\n try {\n this.logger[level](...args);\n } catch (error) {\n this.fallbackLogger[level](...args);\n }\n }\n}\n", "import { EvaluationContext, TransactionContextPropagator } from './types';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext(_: EvaluationContext, callback: () => void): void {\n callback();\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import { Logger, ManageLogger } from './types';\nimport EventEmitter from 'events';\nimport { SafeLogger } from './logger';\n\nexport type EventMetadata = {\n [key: string]: string | boolean | number;\n};\n\nexport type EventDetails = {\n clientName?: string;\n message?: string;\n flagsChanged?: string[];\n metadata?: EventMetadata;\n};\n\nexport type EventHandler = (eventDetails?: EventDetails) => Promise<unknown> | unknown;\n\nexport interface Eventing {\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * @param {ProviderEvents} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n */\n addHandler(eventType: ProviderEvents, handler: EventHandler): void;\n\n /**\n * Removes a handler for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void;\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers(eventType: ProviderEvents): EventHandler[];\n}\n\nexport enum ProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n\n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n Stale = 'PROVIDER_STALE',\n}\n\nexport class OpenFeatureEventEmitter implements ManageLogger<OpenFeatureEventEmitter> {\n private readonly _handlers = new WeakMap<EventHandler, EventHandler>();\n private readonly eventEmitter = new EventEmitter({ captureRejections: true });\n private _eventLogger?: Logger;\n\n constructor(private readonly globalLogger?: () => Logger) {\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n\n emit(eventType: ProviderEvents, context?: EventDetails): void {\n this.eventEmitter.emit(eventType, context);\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n // The handlers have to be wrapped with an async function because if a synchronous functions throws an error,\n // the other handlers will not run.\n const asyncHandler = async (context?: EventDetails) => {\n await handler(context);\n };\n // The async handler has to be written to the map, because we need to get the wrapper function when deleting a listener\n this._handlers.set(handler, asyncHandler);\n this.eventEmitter.on(eventType, asyncHandler);\n }\n\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void {\n // Get the wrapper function for this handler, to delete it from the event emitter\n const asyncHandler = this._handlers.get(handler);\n\n if (!asyncHandler) {\n return;\n }\n\n this.eventEmitter.removeListener(eventType, asyncHandler);\n }\n\n removeAllHandlers(eventType?: ProviderEvents): void {\n // If giving undefined, the listeners are not removed, so we have to check explicitly\n if (eventType) {\n this.eventEmitter.removeAllListeners(eventType);\n } else {\n this.eventEmitter.removeAllListeners();\n }\n }\n\n getHandlers(eventType: ProviderEvents): EventHandler[] {\n return this.eventEmitter.listeners(eventType) as EventHandler[];\n }\n\n setLogger(logger: Logger): this {\n this._eventLogger = new SafeLogger(logger);\n return this;\n }\n\n private get _logger() {\n return this._eventLogger || this.globalLogger?.();\n }\n}\n", "/**\n * Checks whether the parameter is a string.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Returns the parameter if it is a string, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {string|undefined} The parameter if it is a string, otherwise undefined\n */\nexport function stringOrUndefined(value: unknown): string | undefined {\n return isString(value) ? value : undefined;\n}\n\n/**\n * Checks whether the parameter is an object.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is an object\n */\nexport function isObject<T extends object>(value: unknown): value is T {\n return typeof value === 'object';\n}\n\n/**\n * Returns the parameter if it is an object, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {object|undefined} The parameter if it is an object, otherwise undefined\n */\nexport function objectOrUndefined<T extends object>(value: unknown): T | undefined {\n return isObject<T>(value) ? value : undefined;\n}\n", "import { DefaultLogger, SafeLogger } from './logger';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } from './no-op-transaction-context-propagator';\nimport {\n CommonProvider,\n EvaluationContext,\n Logger,\n ProviderMetadata,\n TransactionContext,\n TransactionContextPropagator,\n} from './types';\nimport { EventDetails, EventHandler, Eventing, OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport { objectOrUndefined, stringOrUndefined } from './type-guards';\n\nexport abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProvider> implements Eventing {\n protected _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n protected _context: EvaluationContext = {};\n protected _logger: Logger = new DefaultLogger();\n\n protected abstract _defaultProvider: P;\n\n private readonly _events = new OpenFeatureEventEmitter(() => this._logger);\n private readonly _clientEventHandlers: Map<string | undefined, [ProviderEvents, EventHandler][]> = new Map();\n protected _clientProviders: Map<string, P> = new Map();\n protected _clientEvents: Map<string | undefined, OpenFeatureEventEmitter> = new Map();\n\n abstract clearHooks(): this;\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n /**\n * Get metadata about registered provider.\n * @returns {ProviderMetadata} Provider Metadata\n */\n get providerMetadata(): ProviderMetadata {\n return this._defaultProvider.metadata;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * When changing the provider, the currently attached handlers will listen to the events of the new provider.\n * @param {ProviderEvents} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n */\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this._events.addHandler(eventType, handler);\n }\n\n /**\n * Removes a handler for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this._events.removeHandler(eventType, handler);\n }\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {ProviderEvents} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers(eventType: ProviderEvents): EventHandler[] {\n return this._events.getHandlers(eventType);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by unnamed clients and named clients to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing clients without a name.\n * @template P\n * @param {P} provider The provider responsible for flag evaluations.\n * @returns {OpenFeatureCommonAPI} OpenFeature API\n */\n setProvider(provider: P): this;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients with that name.\n * @template P\n * @param {string} clientName The name to identify the client\n * @param {P} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(clientName: string, provider: P): this;\n setProvider(clientOrProvider?: string | P, providerOrUndefined?: P): this {\n const clientName = stringOrUndefined(clientOrProvider);\n const provider = objectOrUndefined<P>(clientOrProvider) ?? objectOrUndefined<P>(providerOrUndefined);\n\n if (!provider) {\n return this;\n }\n\n const oldProvider = this.getProviderForClient(clientName);\n\n // ignore no-ops\n if (oldProvider === provider) {\n return this;\n }\n\n const clientEmitter = this.getAndCacheEventEmitterForClient(clientName);\n\n if (typeof provider.initialize === 'function') {\n provider\n .initialize?.(this._context)\n ?.then(() => {\n clientEmitter.emit(ProviderEvents.Ready, { clientName });\n this._events?.emit(ProviderEvents.Ready, { clientName });\n })\n ?.catch((error) => {\n clientEmitter.emit(ProviderEvents.Error, { clientName, message: error.message });\n this._events?.emit(ProviderEvents.Error, { clientName, message: error.message });\n });\n } else {\n clientEmitter.emit(ProviderEvents.Ready, { clientName });\n this._events?.emit(ProviderEvents.Ready, { clientName });\n }\n\n if (clientName) {\n this._clientProviders.set(clientName, provider);\n } else {\n this._defaultProvider = provider;\n }\n\n this.transferListeners(oldProvider, provider, clientName, clientEmitter);\n\n // Do not close a provider that is bound to any client\n if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {\n oldProvider?.onClose?.();\n }\n\n return this;\n }\n\n protected getProviderForClient(name?: string): P {\n if (!name) {\n return this._defaultProvider;\n }\n\n return this._clientProviders.get(name) ?? this._defaultProvider;\n }\n\n protected getAndCacheEventEmitterForClient(name?: string): OpenFeatureEventEmitter {\n const emitter = this._clientEvents.get(name);\n\n if (emitter) {\n return emitter;\n }\n\n // lazily add the event emitters\n const newEmitter = new OpenFeatureEventEmitter(() => this._logger);\n this._clientEvents.set(name, newEmitter);\n\n const clientProvider = this.getProviderForClient(name);\n Object.values<ProviderEvents>(ProviderEvents).forEach((eventType) =>\n clientProvider.events?.addHandler(eventType, async (details?: EventDetails) => {\n newEmitter.emit(eventType, { ...details, clientName: name });\n })\n );\n\n return newEmitter;\n }\n\n private transferListeners(\n oldProvider: P,\n newProvider: P,\n clientName: string | undefined,\n clientEmitter: OpenFeatureEventEmitter\n ) {\n this._clientEventHandlers\n .get(clientName)\n ?.forEach((eventHandler) => oldProvider.events?.removeHandler(...eventHandler));\n\n // iterate over the event types\n const newClientHandlers = Object.values<ProviderEvents>(ProviderEvents).map<[ProviderEvents, EventHandler]>(\n (eventType) => {\n const handler = async (details?: EventDetails) => {\n // on each event type, fire the associated handlers\n clientEmitter.emit(eventType, { ...details, clientName });\n this._events.emit(eventType, { ...details, clientName });\n };\n\n return [eventType, handler];\n }\n );\n\n this._clientEventHandlers.set(clientName, newClientHandlers);\n newClientHandlers.forEach((eventHandler) => newProvider.events?.addHandler(...eventHandler));\n }\n\n async close(): Promise<void> {\n try {\n await this?._defaultProvider?.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider, err);\n }\n\n const providers = Array.from(this._clientProviders);\n\n await Promise.all(\n providers.map(async ([, provider]) => {\n try {\n await provider.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider, err);\n }\n })\n );\n }\n\n private handleShutdownError(provider: P, err: unknown) {\n this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);\n this._logger.error((err as Error)?.stack);\n }\n\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): OpenFeatureCommonAPI<P> {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}\n", "import { JsonValue, ProviderStatus, ResolutionDetails } from '@openfeature/shared';\nimport { Provider } from './types';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n get status(): ProviderStatus {\n /**\n * This is due to the NoopProvider not being a real provider.\n * We do not want it to trigger the Ready event handlers, so we never set this to ready.\n * With the NoopProvider assigned, the client can be assumed to be uninitialized.\n * https://github.com/open-feature/js-sdk/pull/429#discussion_r1202642654\n */\n return ProviderStatus.NOT_READY;\n }\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import { EvaluationContext, FlagValue, Logger, OpenFeatureCommonAPI, SafeLogger } from '@openfeature/shared';\nimport { OpenFeatureClient } from './client';\nimport { NOOP_PROVIDER } from './no-op-provider';\nimport { Client, Hook, Provider } from './types';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider> {\n protected _hooks: Hook[] = [];\n protected _defaultProvider: Provider = NOOP_PROVIDER;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {\n super();\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n async setContext(context: EvaluationContext): Promise<void> {\n const oldContext = this._context;\n this._context = context;\n await this._defaultProvider?.onContextChange?.(oldContext, context);\n }\n\n /**\n * A factory function for creating new named OpenFeature clients. Clients can contain\n * their own state (e.g. logger, hook, context). Multiple clients can be used\n * to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} name The name of the client\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(name?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(name),\n () => this.getAndCacheEventEmitterForClient(name),\n () => this._logger,\n { name, version }\n );\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import {\n ClientMetadata,\n ErrorCode,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n OpenFeatureError,\n OpenFeatureEventEmitter,\n ProviderEvents,\n ProviderStatus,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n} from '@openfeature/shared';\nimport { OpenFeature } from './open-feature';\nimport { Client, FlagEvaluationOptions, Hook, Provider } from './types';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\n\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly emitterAccessor: () => OpenFeatureEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n name: this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const providerReady = !this._provider.status || this._provider.status === ProviderStatus.READY;\n\n if (eventType === ProviderEvents.Ready && providerReady) {\n // run immediately, we're ready.\n try {\n handler({ clientName: this.metadata.name });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {}\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...OpenFeature.getHooks(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...OpenFeature.getContext(),\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: OpenFeature.providerMetadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze({}),\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n for (const hook of hooks) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n // use Object.assign to avoid modification of frozen hookContext\n Object.assign(hookContext.context, {\n ...hookContext.context,\n ...hook?.before?.(hookContext, Object.freeze(options.hookHints)),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ReflectApply", "ReflectOwnKeys", "NumberIsNaN", "EventEmitter", "once", "ErrorCode", "ProviderStatus", "ProviderEvents", "EventEmitter", "_a", "err"]
7
7
  }
package/dist/types.d.ts CHANGED
@@ -365,6 +365,7 @@ declare abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonPro
365
365
  protected _logger: Logger;
366
366
  protected abstract _defaultProvider: P;
367
367
  private readonly _events;
368
+ private readonly _clientEventHandlers;
368
369
  protected _clientProviders: Map<string, P>;
369
370
  protected _clientEvents: Map<string | undefined, OpenFeatureEventEmitter>;
370
371
  abstract clearHooks(): this;
@@ -414,7 +415,7 @@ declare abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonPro
414
415
  */
415
416
  setProvider(clientName: string, provider: P): this;
416
417
  protected getProviderForClient(name?: string): P;
417
- protected getEventEmitterForClient(name?: string): OpenFeatureEventEmitter;
418
+ protected getAndCacheEventEmitterForClient(name?: string): OpenFeatureEventEmitter;
418
419
  private transferListeners;
419
420
  close(): Promise<void>;
420
421
  private handleShutdownError;
@@ -627,12 +628,12 @@ type OpenFeatureClientOptions = {
627
628
  };
628
629
  declare class OpenFeatureClient implements Client {
629
630
  private readonly providerAccessor;
630
- private readonly events;
631
+ private readonly emitterAccessor;
631
632
  private readonly globalLogger;
632
633
  private readonly options;
633
634
  private _hooks;
634
635
  private _clientLogger?;
635
- constructor(providerAccessor: () => Provider, events: () => OpenFeatureEventEmitter, globalLogger: () => Logger, options: OpenFeatureClientOptions);
636
+ constructor(providerAccessor: () => Provider, emitterAccessor: () => OpenFeatureEventEmitter, globalLogger: () => Logger, options: OpenFeatureClientOptions);
636
637
  get metadata(): ClientMetadata;
637
638
  addHandler(eventType: ProviderEvents, handler: EventHandler): void;
638
639
  removeHandler(notificationType: ProviderEvents, handler: EventHandler): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfeature/web-sdk",
3
- "version": "0.3.3-experimental",
3
+ "version": "0.3.5-experimental",
4
4
  "description": "OpenFeature SDK for Web",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "files": [