@openfeature/server-sdk 1.6.3 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -1,12 +1,10 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __defProps = Object.defineProperties;
5
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
5
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
8
7
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
- var __getProtoOf = Object.getPrototypeOf;
10
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
11
9
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
10
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -34,14 +32,7 @@ var __copyProps = (to, from, except, desc) => {
34
32
  }
35
33
  return to;
36
34
  };
37
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
- // If the importer is in node compatibility mode or this is not an ESM
39
- // file that has been converted to a CommonJS file using a Babel-
40
- // compatible transform (i.e. "__esModule" has not been set), then set
41
- // "default" to the CommonJS "module.exports" for node compatibility.
42
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
- mod
44
- ));
35
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
45
36
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
37
  var __async = (__this, __arguments, generator) => {
47
38
  return new Promise((resolve, reject) => {
@@ -67,580 +58,20 @@ var __async = (__this, __arguments, generator) => {
67
58
  // src/index.ts
68
59
  var src_exports = {};
69
60
  __export(src_exports, {
70
- DefaultLogger: () => DefaultLogger,
71
- ErrorCode: () => ErrorCode,
72
- FlagNotFoundError: () => FlagNotFoundError,
73
- GeneralError: () => GeneralError,
74
61
  InMemoryProvider: () => InMemoryProvider,
75
- InternalEventEmitter: () => InternalEventEmitter,
76
- InvalidContextError: () => InvalidContextError,
77
- LOG_LEVELS: () => LOG_LEVELS,
78
62
  NOOP_PROVIDER: () => NOOP_PROVIDER,
79
63
  NOOP_TRANSACTION_CONTEXT_PROPAGATOR: () => NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
80
64
  OpenFeature: () => OpenFeature,
81
65
  OpenFeatureAPI: () => OpenFeatureAPI,
82
- OpenFeatureClient: () => OpenFeatureClient,
83
- OpenFeatureCommonAPI: () => OpenFeatureCommonAPI,
84
- OpenFeatureError: () => OpenFeatureError,
85
- OpenFeatureEventEmitter: () => OpenFeatureEventEmitter,
86
- ParseError: () => ParseError,
87
- ProviderEvents: () => ProviderEvents,
88
- ProviderStatus: () => ProviderStatus,
89
- SafeLogger: () => SafeLogger,
90
- StandardResolutionReasons: () => StandardResolutionReasons,
91
- TargetingKeyMissingError: () => TargetingKeyMissingError,
92
- TypeMismatchError: () => TypeMismatchError,
93
- isObject: () => isObject,
94
- isString: () => isString,
95
- objectOrUndefined: () => objectOrUndefined,
96
- statusMatchesEvent: () => statusMatchesEvent,
97
- stringOrUndefined: () => stringOrUndefined
66
+ OpenFeatureClient: () => OpenFeatureClient
98
67
  });
99
68
  module.exports = __toCommonJS(src_exports);
100
69
 
101
- // ../shared/src/errors/open-feature-error-abstract.ts
102
- var OpenFeatureError = class extends Error {
103
- constructor(message) {
104
- super(message);
105
- Object.setPrototypeOf(this, OpenFeatureError.prototype);
106
- this.name = "OpenFeatureError";
107
- }
108
- };
109
-
110
- // ../shared/src/evaluation/evaluation.ts
111
- var StandardResolutionReasons = {
112
- /**
113
- * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
114
- */
115
- TARGETING_MATCH: "TARGETING_MATCH",
116
- /**
117
- * The resolved value was the result of pseudorandom assignment.
118
- */
119
- SPLIT: "SPLIT",
120
- /**
121
- * The resolved value was the result of the flag being disabled in the management system.
122
- */
123
- DISABLED: "DISABLED",
124
- /**
125
- * The resolved value was configured statically, or otherwise fell back to a pre-configured value.
126
- */
127
- DEFAULT: "DEFAULT",
128
- /**
129
- * The reason for the resolved value could not be determined.
130
- */
131
- UNKNOWN: "UNKNOWN",
132
- /**
133
- * The resolved value is static (no dynamic evaluation).
134
- */
135
- STATIC: "STATIC",
136
- /**
137
- * The resolved value was retrieved from cache.
138
- */
139
- CACHED: "CACHED",
140
- /**
141
- * The resolved value was the result of an error.
142
- *
143
- * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.
144
- */
145
- ERROR: "ERROR"
146
- };
147
- var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
148
- ErrorCode2["PROVIDER_NOT_READY"] = "PROVIDER_NOT_READY";
149
- ErrorCode2["FLAG_NOT_FOUND"] = "FLAG_NOT_FOUND";
150
- ErrorCode2["PARSE_ERROR"] = "PARSE_ERROR";
151
- ErrorCode2["TYPE_MISMATCH"] = "TYPE_MISMATCH";
152
- ErrorCode2["TARGETING_KEY_MISSING"] = "TARGETING_KEY_MISSING";
153
- ErrorCode2["INVALID_CONTEXT"] = "INVALID_CONTEXT";
154
- ErrorCode2["GENERAL"] = "GENERAL";
155
- return ErrorCode2;
156
- })(ErrorCode || {});
157
-
158
- // ../shared/src/errors/general-error.ts
159
- var GeneralError = class extends OpenFeatureError {
160
- constructor(message) {
161
- super(message);
162
- Object.setPrototypeOf(this, GeneralError.prototype);
163
- this.name = "GeneralError";
164
- this.code = "GENERAL" /* GENERAL */;
165
- }
166
- };
167
-
168
- // ../shared/src/errors/flag-not-found-error.ts
169
- var FlagNotFoundError = class extends OpenFeatureError {
170
- constructor(message) {
171
- super(message);
172
- Object.setPrototypeOf(this, FlagNotFoundError.prototype);
173
- this.name = "FlagNotFoundError";
174
- this.code = "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */;
175
- }
176
- };
177
-
178
- // ../shared/src/errors/parse-error.ts
179
- var ParseError = class extends OpenFeatureError {
180
- constructor(message) {
181
- super(message);
182
- Object.setPrototypeOf(this, ParseError.prototype);
183
- this.name = "ParseError";
184
- this.code = "PARSE_ERROR" /* PARSE_ERROR */;
185
- }
186
- };
187
-
188
- // ../shared/src/errors/type-mismatch-error.ts
189
- var TypeMismatchError = class extends OpenFeatureError {
190
- constructor(message) {
191
- super(message);
192
- Object.setPrototypeOf(this, TypeMismatchError.prototype);
193
- this.name = "TypeMismatchError";
194
- this.code = "TYPE_MISMATCH" /* TYPE_MISMATCH */;
195
- }
196
- };
197
-
198
- // ../shared/src/errors/targeting-key-missing-error.ts
199
- var TargetingKeyMissingError = class extends OpenFeatureError {
200
- constructor(message) {
201
- super(message);
202
- Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);
203
- this.name = "TargetingKeyMissingError";
204
- this.code = "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */;
205
- }
206
- };
207
-
208
- // ../shared/src/errors/invalid-context-error.ts
209
- var InvalidContextError = class extends OpenFeatureError {
210
- constructor(message) {
211
- super(message);
212
- Object.setPrototypeOf(this, InvalidContextError.prototype);
213
- this.name = "InvalidContextError";
214
- this.code = "INVALID_CONTEXT" /* INVALID_CONTEXT */;
215
- }
216
- };
217
-
218
- // ../shared/src/provider/provider.ts
219
- var ProviderStatus = /* @__PURE__ */ ((ProviderStatus2) => {
220
- ProviderStatus2["NOT_READY"] = "NOT_READY";
221
- ProviderStatus2["READY"] = "READY";
222
- ProviderStatus2["ERROR"] = "ERROR";
223
- ProviderStatus2["STALE"] = "STALE";
224
- return ProviderStatus2;
225
- })(ProviderStatus || {});
226
-
227
- // ../shared/src/events/events.ts
228
- var ProviderEvents = /* @__PURE__ */ ((ProviderEvents3) => {
229
- ProviderEvents3["Ready"] = "PROVIDER_READY";
230
- ProviderEvents3["Error"] = "PROVIDER_ERROR";
231
- ProviderEvents3["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
232
- ProviderEvents3["Stale"] = "PROVIDER_STALE";
233
- return ProviderEvents3;
234
- })(ProviderEvents || {});
235
-
236
- // ../shared/src/events/event-utils.ts
237
- var eventStatusMap = {
238
- ["READY" /* READY */]: "PROVIDER_READY" /* Ready */,
239
- ["ERROR" /* ERROR */]: "PROVIDER_ERROR" /* Error */,
240
- ["STALE" /* STALE */]: "PROVIDER_STALE" /* Stale */,
241
- ["NOT_READY" /* NOT_READY */]: void 0
242
- };
243
- var statusMatchesEvent = (event, status) => {
244
- return !status && event === "PROVIDER_READY" /* Ready */ || eventStatusMap[status] === event;
245
- };
246
-
247
- // ../shared/src/events/open-feature-event-emitter.ts
248
- var import_events2 = __toESM(require("events"));
249
-
250
- // ../shared/src/logger/default-logger.ts
251
- var DefaultLogger = class {
252
- error(...args) {
253
- console.error(...args);
254
- }
255
- warn(...args) {
256
- console.warn(...args);
257
- }
258
- info() {
259
- }
260
- debug() {
261
- }
262
- };
263
-
264
- // ../shared/src/logger/safe-logger.ts
265
- var LOG_LEVELS = ["error", "warn", "info", "debug"];
266
- var SafeLogger = class {
267
- constructor(logger) {
268
- this.fallbackLogger = new DefaultLogger();
269
- try {
270
- for (const level of LOG_LEVELS) {
271
- if (!logger[level] || typeof logger[level] !== "function") {
272
- throw new Error(`The provided logger is missing the ${level} method.`);
273
- }
274
- }
275
- this.logger = logger;
276
- } catch (err) {
277
- console.error(err);
278
- console.error("Falling back to the default logger.");
279
- this.logger = this.fallbackLogger;
280
- }
281
- }
282
- error(...args) {
283
- this.log("error", ...args);
284
- }
285
- warn(...args) {
286
- this.log("warn", ...args);
287
- }
288
- info(...args) {
289
- this.log("info", ...args);
290
- }
291
- debug(...args) {
292
- this.log("debug", ...args);
293
- }
294
- log(level, ...args) {
295
- try {
296
- this.logger[level](...args);
297
- } catch (error) {
298
- this.fallbackLogger[level](...args);
299
- }
300
- }
301
- };
302
-
303
- // ../shared/src/events/open-feature-event-emitter.ts
304
- var GenericEventEmitter = class {
305
- constructor(globalLogger) {
306
- this.globalLogger = globalLogger;
307
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
308
- this._handlers = /* @__PURE__ */ new WeakMap();
309
- this.eventEmitter = new import_events2.default({ captureRejections: true });
310
- this.eventEmitter.on("error", (err) => {
311
- var _a;
312
- (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
313
- });
314
- }
315
- emit(eventType, context) {
316
- this.eventEmitter.emit(eventType, context);
317
- }
318
- addHandler(eventType, handler) {
319
- const asyncHandler = (details) => __async(this, null, function* () {
320
- yield handler(details);
321
- });
322
- this._handlers.set(handler, asyncHandler);
323
- this.eventEmitter.on(eventType, asyncHandler);
324
- }
325
- removeHandler(eventType, handler) {
326
- const asyncHandler = this._handlers.get(handler);
327
- if (!asyncHandler) {
328
- return;
329
- }
330
- this.eventEmitter.removeListener(eventType, asyncHandler);
331
- }
332
- removeAllHandlers(eventType) {
333
- if (eventType) {
334
- this.eventEmitter.removeAllListeners(eventType);
335
- } else {
336
- this.eventEmitter.removeAllListeners();
337
- }
338
- }
339
- getHandlers(eventType) {
340
- return this.eventEmitter.listeners(eventType);
341
- }
342
- setLogger(logger) {
343
- this._eventLogger = new SafeLogger(logger);
344
- return this;
345
- }
346
- get _logger() {
347
- var _a, _b;
348
- return (_b = this._eventLogger) != null ? _b : (_a = this.globalLogger) == null ? void 0 : _a.call(this);
349
- }
350
- };
351
- var OpenFeatureEventEmitter = class extends GenericEventEmitter {
352
- };
353
- var InternalEventEmitter = class extends GenericEventEmitter {
354
- };
355
-
356
- // ../shared/src/transaction-context/no-op-transaction-context-propagator.ts
357
- var NoopTransactionContextPropagator = class {
358
- getTransactionContext() {
359
- return {};
360
- }
361
- setTransactionContext(_, callback) {
362
- callback();
363
- }
364
- };
365
- var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
366
-
367
- // ../shared/src/type-guards.ts
368
- function isString(value) {
369
- return typeof value === "string";
370
- }
371
- function stringOrUndefined(value) {
372
- return isString(value) ? value : void 0;
373
- }
374
- function isObject(value) {
375
- return typeof value === "object";
376
- }
377
- function objectOrUndefined(value) {
378
- return isObject(value) ? value : void 0;
379
- }
380
-
381
- // ../shared/src/filter.ts
382
- function isDefined(input) {
383
- return typeof input !== "undefined" && input !== null;
384
- }
385
-
386
- // ../shared/src/open-feature.ts
387
- var OpenFeatureCommonAPI = class {
388
- constructor(category) {
389
- this._hooks = [];
390
- this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
391
- this._context = {};
392
- this._logger = new DefaultLogger();
393
- this._events = new InternalEventEmitter(() => this._logger);
394
- this._clientEventHandlers = /* @__PURE__ */ new Map();
395
- this._clientProviders = /* @__PURE__ */ new Map();
396
- this._clientEvents = /* @__PURE__ */ new Map();
397
- this._runsOn = category;
398
- }
399
- addHooks(...hooks) {
400
- this._hooks = [...this._hooks, ...hooks];
401
- return this;
402
- }
403
- getHooks() {
404
- return this._hooks;
405
- }
406
- clearHooks() {
407
- this._hooks = [];
408
- return this;
409
- }
410
- setLogger(logger) {
411
- this._logger = new SafeLogger(logger);
412
- return this;
413
- }
414
- /**
415
- * Get metadata about registered provider.
416
- * @returns {ProviderMetadata} Provider Metadata
417
- */
418
- get providerMetadata() {
419
- return this._defaultProvider.metadata;
420
- }
421
- /**
422
- * Adds a handler for the given provider event type.
423
- * The handlers are called in the order they have been added.
424
- * API (global) events run for all providers.
425
- * @param {ProviderEvents} eventType The provider event type to listen to
426
- * @param {EventHandler} handler The handler to run on occurrence of the event type
427
- */
428
- addHandler(eventType, handler) {
429
- [.../* @__PURE__ */ new Map([[void 0, this._defaultProvider]]), ...this._clientProviders].forEach((keyProviderTuple) => {
430
- var _a;
431
- const clientName = keyProviderTuple[0];
432
- const provider = keyProviderTuple[1];
433
- const shouldRunNow = statusMatchesEvent(eventType, keyProviderTuple[1].status);
434
- if (shouldRunNow) {
435
- try {
436
- handler({ clientName, providerName: provider.metadata.name });
437
- } catch (err) {
438
- (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
439
- }
440
- }
441
- });
442
- this._events.addHandler(eventType, handler);
443
- }
444
- /**
445
- * Removes a handler for the given provider event type.
446
- * @param {ProviderEvents} eventType The provider event type to remove the listener for
447
- * @param {EventHandler} handler The handler to remove for the provider event type
448
- */
449
- removeHandler(eventType, handler) {
450
- this._events.removeHandler(eventType, handler);
451
- }
452
- /**
453
- * Gets the current handlers for the given provider event type.
454
- * @param {ProviderEvents} eventType The provider event type to get the current handlers for
455
- * @returns {EventHandler[]} The handlers currently attached to the given provider event type
456
- */
457
- getHandlers(eventType) {
458
- return this._events.getHandlers(eventType);
459
- }
460
- setProviderAndWait(clientOrProvider, providerOrUndefined) {
461
- return __async(this, null, function* () {
462
- yield this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
463
- });
464
- }
465
- setProvider(clientOrProvider, providerOrUndefined) {
466
- const maybePromise = this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
467
- if (maybePromise) {
468
- maybePromise.catch(() => {
469
- });
470
- }
471
- return this;
472
- }
473
- setAwaitableProvider(clientOrProvider, providerOrUndefined) {
474
- var _a, _b, _c, _d, _e, _f;
475
- const clientName = stringOrUndefined(clientOrProvider);
476
- const provider = (_a = objectOrUndefined(clientOrProvider)) != null ? _a : objectOrUndefined(providerOrUndefined);
477
- if (!provider) {
478
- this._logger.debug("No provider defined, ignoring setProvider call");
479
- return;
480
- }
481
- const oldProvider = this.getProviderForClient(clientName);
482
- const providerName = provider.metadata.name;
483
- if (oldProvider === provider) {
484
- this._logger.debug("Provider is already set, ignoring setProvider call");
485
- return;
486
- }
487
- if (!provider.runsOn) {
488
- this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);
489
- } else if (provider.runsOn !== this._runsOn) {
490
- throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);
491
- }
492
- const emitters = this.getAssociatedEventEmitters(clientName);
493
- if (typeof provider.initialize === "function" && provider.status === void 0) {
494
- const activeLogger = this._logger || console;
495
- activeLogger.warn(
496
- `Provider ${providerName} implements 'initialize' but not 'status'. Please implement 'status'.`
497
- );
498
- }
499
- let initializationPromise = void 0;
500
- if ((provider == null ? void 0 : provider.status) === "NOT_READY" /* NOT_READY */ && typeof provider.initialize === "function") {
501
- initializationPromise = (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
502
- var _a2;
503
- this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
504
- emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
505
- });
506
- (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
507
- })) == null ? void 0 : _d.catch((error) => {
508
- var _a2;
509
- this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
510
- emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
511
- });
512
- (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
513
- throw error;
514
- });
515
- } else {
516
- emitters.forEach((emitter) => {
517
- emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
518
- });
519
- (_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
520
- }
521
- if (clientName) {
522
- this._clientProviders.set(clientName, provider);
523
- } else {
524
- this._defaultProvider = provider;
525
- }
526
- this.transferListeners(oldProvider, provider, clientName, emitters);
527
- if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
528
- (_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider);
529
- }
530
- return initializationPromise;
531
- }
532
- getProviderForClient(name) {
533
- var _a;
534
- if (!name) {
535
- return this._defaultProvider;
536
- }
537
- return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
538
- }
539
- buildAndCacheEventEmitterForClient(name) {
540
- const emitter = this._clientEvents.get(name);
541
- if (emitter) {
542
- return emitter;
543
- }
544
- const newEmitter = new InternalEventEmitter(() => this._logger);
545
- this._clientEvents.set(name, newEmitter);
546
- const clientProvider = this.getProviderForClient(name);
547
- Object.values(ProviderEvents).forEach(
548
- (eventType) => {
549
- var _a;
550
- return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
551
- newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name, providerName: clientProvider.metadata.name }));
552
- }));
553
- }
554
- );
555
- return newEmitter;
556
- }
557
- getUnboundEmitters() {
558
- const namedProviders = [...this._clientProviders.keys()];
559
- const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
560
- const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
561
- return [
562
- // all unbound, named emitters
563
- ...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
564
- // the default emitter
565
- this._clientEvents.get(void 0)
566
- ].filter(isDefined);
567
- }
568
- getAssociatedEventEmitters(clientName) {
569
- return clientName ? [this.buildAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
570
- }
571
- transferListeners(oldProvider, newProvider, clientName, emitters) {
572
- var _a;
573
- (_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
574
- var _a2;
575
- return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
576
- });
577
- const newClientHandlers = Object.values(ProviderEvents).map((eventType) => {
578
- const handler = (details) => __async(this, null, function* () {
579
- emitters.forEach((emitter) => {
580
- emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
581
- });
582
- this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
583
- });
584
- return [eventType, handler];
585
- });
586
- this._clientEventHandlers.set(clientName, newClientHandlers);
587
- newClientHandlers.forEach((eventHandler) => {
588
- var _a2;
589
- return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
590
- });
591
- }
592
- close() {
593
- return __async(this, null, function* () {
594
- var _a, _b;
595
- try {
596
- yield (_b = (_a = this == null ? void 0 : this._defaultProvider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
597
- } catch (err) {
598
- this.handleShutdownError(this._defaultProvider, err);
599
- }
600
- const providers = Array.from(this._clientProviders);
601
- yield Promise.all(
602
- providers.map((_0) => __async(this, [_0], function* ([, provider]) {
603
- var _a2;
604
- try {
605
- yield (_a2 = provider.onClose) == null ? void 0 : _a2.call(provider);
606
- } catch (err) {
607
- this.handleShutdownError(this._defaultProvider, err);
608
- }
609
- }))
610
- );
611
- });
612
- }
613
- handleShutdownError(provider, err) {
614
- this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);
615
- this._logger.error(err == null ? void 0 : err.stack);
616
- }
617
- setTransactionContextPropagator(transactionContextPropagator) {
618
- const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
619
- if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
620
- this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
621
- } else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
622
- this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
623
- } else {
624
- this._transactionContextPropagator = transactionContextPropagator;
625
- }
626
- return this;
627
- }
628
- setTransactionContext(transactionContext, callback, ...args) {
629
- this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
630
- }
631
- getTransactionContext() {
632
- try {
633
- return this._transactionContextPropagator.getTransactionContext();
634
- } catch (err) {
635
- const error = err;
636
- this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
637
- this._logger.error(error == null ? void 0 : error.stack);
638
- return {};
639
- }
640
- }
641
- };
70
+ // src/client/open-feature-client.ts
71
+ var import_core5 = require("@openfeature/core");
642
72
 
643
73
  // src/provider/no-op-provider.ts
74
+ var import_core = require("@openfeature/core");
644
75
  var REASON_NO_OP = "No-op";
645
76
  var NoopFeatureProvider = class {
646
77
  constructor() {
@@ -649,7 +80,7 @@ var NoopFeatureProvider = class {
649
80
  };
650
81
  }
651
82
  get status() {
652
- return "NOT_READY" /* NOT_READY */;
83
+ return import_core.ProviderStatus.NOT_READY;
653
84
  }
654
85
  resolveBooleanEvaluation(_, defaultValue) {
655
86
  return this.noOp(defaultValue);
@@ -672,20 +103,24 @@ var NoopFeatureProvider = class {
672
103
  };
673
104
  var NOOP_PROVIDER = new NoopFeatureProvider();
674
105
 
106
+ // src/provider/in-memory-provider/in-memory-provider.ts
107
+ var import_core3 = require("@openfeature/core");
108
+
675
109
  // src/provider/in-memory-provider/variant-not-found-error.ts
676
- var VariantFoundError = class extends OpenFeatureError {
110
+ var import_core2 = require("@openfeature/core");
111
+ var VariantFoundError = class extends import_core2.OpenFeatureError {
677
112
  constructor(message) {
678
113
  super(message);
679
114
  Object.setPrototypeOf(this, VariantFoundError.prototype);
680
115
  this.name = "VariantFoundError";
681
- this.code = "GENERAL" /* GENERAL */;
116
+ this.code = import_core2.ErrorCode.GENERAL;
682
117
  }
683
118
  };
684
119
 
685
120
  // src/provider/in-memory-provider/in-memory-provider.ts
686
121
  var InMemoryProvider = class {
687
122
  constructor(flagConfiguration = {}) {
688
- this.events = new OpenFeatureEventEmitter();
123
+ this.events = new import_core3.OpenFeatureEventEmitter();
689
124
  this.runsOn = "server";
690
125
  this.metadata = {
691
126
  name: "in-memory"
@@ -699,7 +134,7 @@ var InMemoryProvider = class {
699
134
  putConfiguration(flagConfiguration) {
700
135
  const flagsChanged = Object.entries(flagConfiguration).filter(([key, value]) => this._flagConfiguration[key] !== value).map(([key]) => key);
701
136
  this._flagConfiguration = __spreadValues({}, flagConfiguration);
702
- this.events.emit("PROVIDER_CONFIGURATION_CHANGED" /* ConfigurationChanged */, { flagsChanged });
137
+ this.events.emit(import_core3.ProviderEvents.ConfigurationChanged, { flagsChanged });
703
138
  }
704
139
  resolveBooleanEvaluation(flagKey, defaultValue, context, logger) {
705
140
  return this.resolveFlagWithReason(flagKey, defaultValue, context, logger);
@@ -722,12 +157,12 @@ var InMemoryProvider = class {
722
157
  try {
723
158
  const resolutionResult = this.lookupFlagValue(flagKey, defaultValue, ctx, logger);
724
159
  if (typeof (resolutionResult == null ? void 0 : resolutionResult.value) != typeof defaultValue) {
725
- throw new TypeMismatchError();
160
+ throw new import_core3.TypeMismatchError();
726
161
  }
727
162
  return resolutionResult;
728
163
  } catch (error) {
729
- if (!(error instanceof OpenFeatureError)) {
730
- throw new GeneralError((error == null ? void 0 : error.message) || "unknown error");
164
+ if (!(error instanceof import_core3.OpenFeatureError)) {
165
+ throw new import_core3.GeneralError((error == null ? void 0 : error.message) || "unknown error");
731
166
  }
732
167
  throw error;
733
168
  }
@@ -738,11 +173,11 @@ var InMemoryProvider = class {
738
173
  if (!(flagKey in this._flagConfiguration)) {
739
174
  const message = `no flag found with key ${flagKey}`;
740
175
  logger == null ? void 0 : logger.debug(message);
741
- throw new FlagNotFoundError(message);
176
+ throw new import_core3.FlagNotFoundError(message);
742
177
  }
743
178
  const flagSpec = this._flagConfiguration[flagKey];
744
179
  if (flagSpec.disabled) {
745
- return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };
180
+ return { value: defaultValue, reason: import_core3.StandardResolutionReasons.DISABLED };
746
181
  }
747
182
  const isContextEval = ctx && (flagSpec == null ? void 0 : flagSpec.contextEvaluator);
748
183
  const variant = isContextEval ? (_a = flagSpec.contextEvaluator) == null ? void 0 : _a.call(flagSpec, ctx) : flagSpec.defaultVariant;
@@ -755,18 +190,32 @@ var InMemoryProvider = class {
755
190
  return __spreadProps(__spreadValues({
756
191
  value
757
192
  }, variant && { variant }), {
758
- reason: isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC
193
+ reason: isContextEval ? import_core3.StandardResolutionReasons.TARGETING_MATCH : import_core3.StandardResolutionReasons.STATIC
759
194
  });
760
195
  }
761
196
  };
762
197
 
198
+ // src/open-feature.ts
199
+ var import_core4 = require("@openfeature/core");
200
+
201
+ // src/transaction-context/no-op-transaction-context-propagator.ts
202
+ var NoopTransactionContextPropagator = class {
203
+ getTransactionContext() {
204
+ return {};
205
+ }
206
+ setTransactionContext(_, callback) {
207
+ callback();
208
+ }
209
+ };
210
+ var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
211
+
763
212
  // src/open-feature.ts
764
213
  var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/js-sdk/api");
765
214
  var _globalThis = globalThis;
766
- var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
767
- // eslint-disable-next-line @typescript-eslint/no-empty-function
215
+ var OpenFeatureAPI = class extends import_core4.OpenFeatureCommonAPI {
768
216
  constructor() {
769
217
  super("server");
218
+ this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
770
219
  this._defaultProvider = NOOP_PROVIDER;
771
220
  }
772
221
  /**
@@ -792,9 +241,9 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
792
241
  }
793
242
  getClient(nameOrContext, versionOrContext, contextOrUndefined) {
794
243
  var _a, _b;
795
- const name = stringOrUndefined(nameOrContext);
796
- const version = stringOrUndefined(versionOrContext);
797
- const context = (_b = (_a = objectOrUndefined(nameOrContext)) != null ? _a : objectOrUndefined(versionOrContext)) != null ? _b : objectOrUndefined(contextOrUndefined);
244
+ const name = (0, import_core4.stringOrUndefined)(nameOrContext);
245
+ const version = (0, import_core4.stringOrUndefined)(versionOrContext);
246
+ const context = (_b = (_a = (0, import_core4.objectOrUndefined)(nameOrContext)) != null ? _a : (0, import_core4.objectOrUndefined)(versionOrContext)) != null ? _b : (0, import_core4.objectOrUndefined)(contextOrUndefined);
798
247
  return new OpenFeatureClient(
799
248
  () => this.getProviderForClient(name),
800
249
  () => this.buildAndCacheEventEmitterForClient(name),
@@ -803,6 +252,37 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
803
252
  context
804
253
  );
805
254
  }
255
+ /**
256
+ * Clears all registered providers and resets the default provider.
257
+ * @returns {Promise<void>}
258
+ */
259
+ clearProviders() {
260
+ return super.clearProvidersAndSetDefault(NOOP_PROVIDER);
261
+ }
262
+ setTransactionContextPropagator(transactionContextPropagator) {
263
+ const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
264
+ if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
265
+ this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
266
+ } else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
267
+ this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
268
+ } else {
269
+ this._transactionContextPropagator = transactionContextPropagator;
270
+ }
271
+ return this;
272
+ }
273
+ setTransactionContext(transactionContext, callback, ...args) {
274
+ this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
275
+ }
276
+ getTransactionContext() {
277
+ try {
278
+ return this._transactionContextPropagator.getTransactionContext();
279
+ } catch (err) {
280
+ const error = err;
281
+ this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
282
+ this._logger.error(error == null ? void 0 : error.stack);
283
+ return {};
284
+ }
285
+ }
806
286
  };
807
287
  var OpenFeature = OpenFeatureAPI.getInstance();
808
288
 
@@ -826,7 +306,7 @@ var OpenFeatureClient = class {
826
306
  addHandler(eventType, handler) {
827
307
  var _a;
828
308
  this.emitterAccessor().addHandler(eventType, handler);
829
- const shouldRunNow = statusMatchesEvent(eventType, this._provider.status);
309
+ const shouldRunNow = (0, import_core5.statusMatchesEvent)(eventType, this._provider.status);
830
310
  if (shouldRunNow) {
831
311
  try {
832
312
  handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });
@@ -842,7 +322,7 @@ var OpenFeatureClient = class {
842
322
  return this.emitterAccessor().getHandlers(eventType);
843
323
  }
844
324
  setLogger(logger) {
845
- this._clientLogger = new SafeLogger(logger);
325
+ this._clientLogger = new import_core5.SafeLogger(logger);
846
326
  return this;
847
327
  }
848
328
  setContext(context) {
@@ -949,13 +429,13 @@ var OpenFeatureClient = class {
949
429
  return evaluationDetails;
950
430
  } catch (err) {
951
431
  const errorMessage = err == null ? void 0 : err.message;
952
- const errorCode = (err == null ? void 0 : err.code) || "GENERAL" /* GENERAL */;
432
+ const errorCode = (err == null ? void 0 : err.code) || import_core5.ErrorCode.GENERAL;
953
433
  yield this.errorHooks(allHooksReversed, hookContext, err, options);
954
434
  return {
955
435
  errorCode,
956
436
  errorMessage,
957
437
  value: defaultValue,
958
- reason: StandardResolutionReasons.ERROR,
438
+ reason: import_core5.StandardResolutionReasons.ERROR,
959
439
  flagMetadata: Object.freeze({}),
960
440
  flagKey
961
441
  };
@@ -1021,35 +501,16 @@ var OpenFeatureClient = class {
1021
501
  return this._clientLogger || this.globalLogger();
1022
502
  }
1023
503
  };
504
+
505
+ // src/index.ts
506
+ __reExport(src_exports, require("@openfeature/core"), module.exports);
1024
507
  // Annotate the CommonJS export names for ESM import in node:
1025
508
  0 && (module.exports = {
1026
- DefaultLogger,
1027
- ErrorCode,
1028
- FlagNotFoundError,
1029
- GeneralError,
1030
509
  InMemoryProvider,
1031
- InternalEventEmitter,
1032
- InvalidContextError,
1033
- LOG_LEVELS,
1034
510
  NOOP_PROVIDER,
1035
511
  NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
1036
512
  OpenFeature,
1037
513
  OpenFeatureAPI,
1038
- OpenFeatureClient,
1039
- OpenFeatureCommonAPI,
1040
- OpenFeatureError,
1041
- OpenFeatureEventEmitter,
1042
- ParseError,
1043
- ProviderEvents,
1044
- ProviderStatus,
1045
- SafeLogger,
1046
- StandardResolutionReasons,
1047
- TargetingKeyMissingError,
1048
- TypeMismatchError,
1049
- isObject,
1050
- isString,
1051
- objectOrUndefined,
1052
- statusMatchesEvent,
1053
- stringOrUndefined
514
+ OpenFeatureClient
1054
515
  });
1055
516
  //# sourceMappingURL=index.js.map