@openfeature/server-sdk 1.6.3 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -38,549 +38,16 @@ var __async = (__this, __arguments, generator) => {
38
38
  });
39
39
  };
40
40
 
41
- // ../shared/src/errors/open-feature-error-abstract.ts
42
- var OpenFeatureError = class extends Error {
43
- constructor(message) {
44
- super(message);
45
- Object.setPrototypeOf(this, OpenFeatureError.prototype);
46
- this.name = "OpenFeatureError";
47
- }
48
- };
49
-
50
- // ../shared/src/evaluation/evaluation.ts
51
- var StandardResolutionReasons = {
52
- /**
53
- * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
54
- */
55
- TARGETING_MATCH: "TARGETING_MATCH",
56
- /**
57
- * The resolved value was the result of pseudorandom assignment.
58
- */
59
- SPLIT: "SPLIT",
60
- /**
61
- * The resolved value was the result of the flag being disabled in the management system.
62
- */
63
- DISABLED: "DISABLED",
64
- /**
65
- * The resolved value was configured statically, or otherwise fell back to a pre-configured value.
66
- */
67
- DEFAULT: "DEFAULT",
68
- /**
69
- * The reason for the resolved value could not be determined.
70
- */
71
- UNKNOWN: "UNKNOWN",
72
- /**
73
- * The resolved value is static (no dynamic evaluation).
74
- */
75
- STATIC: "STATIC",
76
- /**
77
- * The resolved value was retrieved from cache.
78
- */
79
- CACHED: "CACHED",
80
- /**
81
- * The resolved value was the result of an error.
82
- *
83
- * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.
84
- */
85
- ERROR: "ERROR"
86
- };
87
- var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
88
- ErrorCode2["PROVIDER_NOT_READY"] = "PROVIDER_NOT_READY";
89
- ErrorCode2["FLAG_NOT_FOUND"] = "FLAG_NOT_FOUND";
90
- ErrorCode2["PARSE_ERROR"] = "PARSE_ERROR";
91
- ErrorCode2["TYPE_MISMATCH"] = "TYPE_MISMATCH";
92
- ErrorCode2["TARGETING_KEY_MISSING"] = "TARGETING_KEY_MISSING";
93
- ErrorCode2["INVALID_CONTEXT"] = "INVALID_CONTEXT";
94
- ErrorCode2["GENERAL"] = "GENERAL";
95
- return ErrorCode2;
96
- })(ErrorCode || {});
97
-
98
- // ../shared/src/errors/general-error.ts
99
- var GeneralError = class extends OpenFeatureError {
100
- constructor(message) {
101
- super(message);
102
- Object.setPrototypeOf(this, GeneralError.prototype);
103
- this.name = "GeneralError";
104
- this.code = "GENERAL" /* GENERAL */;
105
- }
106
- };
107
-
108
- // ../shared/src/errors/flag-not-found-error.ts
109
- var FlagNotFoundError = class extends OpenFeatureError {
110
- constructor(message) {
111
- super(message);
112
- Object.setPrototypeOf(this, FlagNotFoundError.prototype);
113
- this.name = "FlagNotFoundError";
114
- this.code = "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */;
115
- }
116
- };
117
-
118
- // ../shared/src/errors/parse-error.ts
119
- var ParseError = class extends OpenFeatureError {
120
- constructor(message) {
121
- super(message);
122
- Object.setPrototypeOf(this, ParseError.prototype);
123
- this.name = "ParseError";
124
- this.code = "PARSE_ERROR" /* PARSE_ERROR */;
125
- }
126
- };
127
-
128
- // ../shared/src/errors/type-mismatch-error.ts
129
- var TypeMismatchError = class extends OpenFeatureError {
130
- constructor(message) {
131
- super(message);
132
- Object.setPrototypeOf(this, TypeMismatchError.prototype);
133
- this.name = "TypeMismatchError";
134
- this.code = "TYPE_MISMATCH" /* TYPE_MISMATCH */;
135
- }
136
- };
137
-
138
- // ../shared/src/errors/targeting-key-missing-error.ts
139
- var TargetingKeyMissingError = class extends OpenFeatureError {
140
- constructor(message) {
141
- super(message);
142
- Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);
143
- this.name = "TargetingKeyMissingError";
144
- this.code = "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */;
145
- }
146
- };
147
-
148
- // ../shared/src/errors/invalid-context-error.ts
149
- var InvalidContextError = class extends OpenFeatureError {
150
- constructor(message) {
151
- super(message);
152
- Object.setPrototypeOf(this, InvalidContextError.prototype);
153
- this.name = "InvalidContextError";
154
- this.code = "INVALID_CONTEXT" /* INVALID_CONTEXT */;
155
- }
156
- };
157
-
158
- // ../shared/src/provider/provider.ts
159
- var ProviderStatus = /* @__PURE__ */ ((ProviderStatus2) => {
160
- ProviderStatus2["NOT_READY"] = "NOT_READY";
161
- ProviderStatus2["READY"] = "READY";
162
- ProviderStatus2["ERROR"] = "ERROR";
163
- ProviderStatus2["STALE"] = "STALE";
164
- return ProviderStatus2;
165
- })(ProviderStatus || {});
166
-
167
- // ../shared/src/events/events.ts
168
- var ProviderEvents = /* @__PURE__ */ ((ProviderEvents3) => {
169
- ProviderEvents3["Ready"] = "PROVIDER_READY";
170
- ProviderEvents3["Error"] = "PROVIDER_ERROR";
171
- ProviderEvents3["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
172
- ProviderEvents3["Stale"] = "PROVIDER_STALE";
173
- return ProviderEvents3;
174
- })(ProviderEvents || {});
175
-
176
- // ../shared/src/events/event-utils.ts
177
- var eventStatusMap = {
178
- ["READY" /* READY */]: "PROVIDER_READY" /* Ready */,
179
- ["ERROR" /* ERROR */]: "PROVIDER_ERROR" /* Error */,
180
- ["STALE" /* STALE */]: "PROVIDER_STALE" /* Stale */,
181
- ["NOT_READY" /* NOT_READY */]: void 0
182
- };
183
- var statusMatchesEvent = (event, status) => {
184
- return !status && event === "PROVIDER_READY" /* Ready */ || eventStatusMap[status] === event;
185
- };
186
-
187
- // ../shared/src/events/open-feature-event-emitter.ts
188
- import EventEmitter from "events";
189
-
190
- // ../shared/src/logger/default-logger.ts
191
- var DefaultLogger = class {
192
- error(...args) {
193
- console.error(...args);
194
- }
195
- warn(...args) {
196
- console.warn(...args);
197
- }
198
- info() {
199
- }
200
- debug() {
201
- }
202
- };
203
-
204
- // ../shared/src/logger/safe-logger.ts
205
- var LOG_LEVELS = ["error", "warn", "info", "debug"];
206
- var SafeLogger = class {
207
- constructor(logger) {
208
- this.fallbackLogger = new DefaultLogger();
209
- try {
210
- for (const level of LOG_LEVELS) {
211
- if (!logger[level] || typeof logger[level] !== "function") {
212
- throw new Error(`The provided logger is missing the ${level} method.`);
213
- }
214
- }
215
- this.logger = logger;
216
- } catch (err) {
217
- console.error(err);
218
- console.error("Falling back to the default logger.");
219
- this.logger = this.fallbackLogger;
220
- }
221
- }
222
- error(...args) {
223
- this.log("error", ...args);
224
- }
225
- warn(...args) {
226
- this.log("warn", ...args);
227
- }
228
- info(...args) {
229
- this.log("info", ...args);
230
- }
231
- debug(...args) {
232
- this.log("debug", ...args);
233
- }
234
- log(level, ...args) {
235
- try {
236
- this.logger[level](...args);
237
- } catch (error) {
238
- this.fallbackLogger[level](...args);
239
- }
240
- }
241
- };
242
-
243
- // ../shared/src/events/open-feature-event-emitter.ts
244
- var GenericEventEmitter = class {
245
- constructor(globalLogger) {
246
- this.globalLogger = globalLogger;
247
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
248
- this._handlers = /* @__PURE__ */ new WeakMap();
249
- this.eventEmitter = new EventEmitter({ captureRejections: true });
250
- this.eventEmitter.on("error", (err) => {
251
- var _a;
252
- (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
253
- });
254
- }
255
- emit(eventType, context) {
256
- this.eventEmitter.emit(eventType, context);
257
- }
258
- addHandler(eventType, handler) {
259
- const asyncHandler = (details) => __async(this, null, function* () {
260
- yield handler(details);
261
- });
262
- this._handlers.set(handler, asyncHandler);
263
- this.eventEmitter.on(eventType, asyncHandler);
264
- }
265
- removeHandler(eventType, handler) {
266
- const asyncHandler = this._handlers.get(handler);
267
- if (!asyncHandler) {
268
- return;
269
- }
270
- this.eventEmitter.removeListener(eventType, asyncHandler);
271
- }
272
- removeAllHandlers(eventType) {
273
- if (eventType) {
274
- this.eventEmitter.removeAllListeners(eventType);
275
- } else {
276
- this.eventEmitter.removeAllListeners();
277
- }
278
- }
279
- getHandlers(eventType) {
280
- return this.eventEmitter.listeners(eventType);
281
- }
282
- setLogger(logger) {
283
- this._eventLogger = new SafeLogger(logger);
284
- return this;
285
- }
286
- get _logger() {
287
- var _a, _b;
288
- return (_b = this._eventLogger) != null ? _b : (_a = this.globalLogger) == null ? void 0 : _a.call(this);
289
- }
290
- };
291
- var OpenFeatureEventEmitter = class extends GenericEventEmitter {
292
- };
293
- var InternalEventEmitter = class extends GenericEventEmitter {
294
- };
295
-
296
- // ../shared/src/transaction-context/no-op-transaction-context-propagator.ts
297
- var NoopTransactionContextPropagator = class {
298
- getTransactionContext() {
299
- return {};
300
- }
301
- setTransactionContext(_, callback) {
302
- callback();
303
- }
304
- };
305
- var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
306
-
307
- // ../shared/src/type-guards.ts
308
- function isString(value) {
309
- return typeof value === "string";
310
- }
311
- function stringOrUndefined(value) {
312
- return isString(value) ? value : void 0;
313
- }
314
- function isObject(value) {
315
- return typeof value === "object";
316
- }
317
- function objectOrUndefined(value) {
318
- return isObject(value) ? value : void 0;
319
- }
320
-
321
- // ../shared/src/filter.ts
322
- function isDefined(input) {
323
- return typeof input !== "undefined" && input !== null;
324
- }
325
-
326
- // ../shared/src/open-feature.ts
327
- var OpenFeatureCommonAPI = class {
328
- constructor(category) {
329
- this._hooks = [];
330
- this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
331
- this._context = {};
332
- this._logger = new DefaultLogger();
333
- this._events = new InternalEventEmitter(() => this._logger);
334
- this._clientEventHandlers = /* @__PURE__ */ new Map();
335
- this._clientProviders = /* @__PURE__ */ new Map();
336
- this._clientEvents = /* @__PURE__ */ new Map();
337
- this._runsOn = category;
338
- }
339
- addHooks(...hooks) {
340
- this._hooks = [...this._hooks, ...hooks];
341
- return this;
342
- }
343
- getHooks() {
344
- return this._hooks;
345
- }
346
- clearHooks() {
347
- this._hooks = [];
348
- return this;
349
- }
350
- setLogger(logger) {
351
- this._logger = new SafeLogger(logger);
352
- return this;
353
- }
354
- /**
355
- * Get metadata about registered provider.
356
- * @returns {ProviderMetadata} Provider Metadata
357
- */
358
- get providerMetadata() {
359
- return this._defaultProvider.metadata;
360
- }
361
- /**
362
- * Adds a handler for the given provider event type.
363
- * The handlers are called in the order they have been added.
364
- * API (global) events run for all providers.
365
- * @param {ProviderEvents} eventType The provider event type to listen to
366
- * @param {EventHandler} handler The handler to run on occurrence of the event type
367
- */
368
- addHandler(eventType, handler) {
369
- [.../* @__PURE__ */ new Map([[void 0, this._defaultProvider]]), ...this._clientProviders].forEach((keyProviderTuple) => {
370
- var _a;
371
- const clientName = keyProviderTuple[0];
372
- const provider = keyProviderTuple[1];
373
- const shouldRunNow = statusMatchesEvent(eventType, keyProviderTuple[1].status);
374
- if (shouldRunNow) {
375
- try {
376
- handler({ clientName, providerName: provider.metadata.name });
377
- } catch (err) {
378
- (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
379
- }
380
- }
381
- });
382
- this._events.addHandler(eventType, handler);
383
- }
384
- /**
385
- * Removes a handler for the given provider event type.
386
- * @param {ProviderEvents} eventType The provider event type to remove the listener for
387
- * @param {EventHandler} handler The handler to remove for the provider event type
388
- */
389
- removeHandler(eventType, handler) {
390
- this._events.removeHandler(eventType, handler);
391
- }
392
- /**
393
- * Gets the current handlers for the given provider event type.
394
- * @param {ProviderEvents} eventType The provider event type to get the current handlers for
395
- * @returns {EventHandler[]} The handlers currently attached to the given provider event type
396
- */
397
- getHandlers(eventType) {
398
- return this._events.getHandlers(eventType);
399
- }
400
- setProviderAndWait(clientOrProvider, providerOrUndefined) {
401
- return __async(this, null, function* () {
402
- yield this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
403
- });
404
- }
405
- setProvider(clientOrProvider, providerOrUndefined) {
406
- const maybePromise = this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
407
- if (maybePromise) {
408
- maybePromise.catch(() => {
409
- });
410
- }
411
- return this;
412
- }
413
- setAwaitableProvider(clientOrProvider, providerOrUndefined) {
414
- var _a, _b, _c, _d, _e, _f;
415
- const clientName = stringOrUndefined(clientOrProvider);
416
- const provider = (_a = objectOrUndefined(clientOrProvider)) != null ? _a : objectOrUndefined(providerOrUndefined);
417
- if (!provider) {
418
- this._logger.debug("No provider defined, ignoring setProvider call");
419
- return;
420
- }
421
- const oldProvider = this.getProviderForClient(clientName);
422
- const providerName = provider.metadata.name;
423
- if (oldProvider === provider) {
424
- this._logger.debug("Provider is already set, ignoring setProvider call");
425
- return;
426
- }
427
- if (!provider.runsOn) {
428
- this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);
429
- } else if (provider.runsOn !== this._runsOn) {
430
- throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);
431
- }
432
- const emitters = this.getAssociatedEventEmitters(clientName);
433
- if (typeof provider.initialize === "function" && provider.status === void 0) {
434
- const activeLogger = this._logger || console;
435
- activeLogger.warn(
436
- `Provider ${providerName} implements 'initialize' but not 'status'. Please implement 'status'.`
437
- );
438
- }
439
- let initializationPromise = void 0;
440
- if ((provider == null ? void 0 : provider.status) === "NOT_READY" /* NOT_READY */ && typeof provider.initialize === "function") {
441
- initializationPromise = (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
442
- var _a2;
443
- this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
444
- emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
445
- });
446
- (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
447
- })) == null ? void 0 : _d.catch((error) => {
448
- var _a2;
449
- this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
450
- emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
451
- });
452
- (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
453
- throw error;
454
- });
455
- } else {
456
- emitters.forEach((emitter) => {
457
- emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
458
- });
459
- (_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
460
- }
461
- if (clientName) {
462
- this._clientProviders.set(clientName, provider);
463
- } else {
464
- this._defaultProvider = provider;
465
- }
466
- this.transferListeners(oldProvider, provider, clientName, emitters);
467
- if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
468
- (_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider);
469
- }
470
- return initializationPromise;
471
- }
472
- getProviderForClient(name) {
473
- var _a;
474
- if (!name) {
475
- return this._defaultProvider;
476
- }
477
- return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
478
- }
479
- buildAndCacheEventEmitterForClient(name) {
480
- const emitter = this._clientEvents.get(name);
481
- if (emitter) {
482
- return emitter;
483
- }
484
- const newEmitter = new InternalEventEmitter(() => this._logger);
485
- this._clientEvents.set(name, newEmitter);
486
- const clientProvider = this.getProviderForClient(name);
487
- Object.values(ProviderEvents).forEach(
488
- (eventType) => {
489
- var _a;
490
- return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
491
- newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name, providerName: clientProvider.metadata.name }));
492
- }));
493
- }
494
- );
495
- return newEmitter;
496
- }
497
- getUnboundEmitters() {
498
- const namedProviders = [...this._clientProviders.keys()];
499
- const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
500
- const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
501
- return [
502
- // all unbound, named emitters
503
- ...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
504
- // the default emitter
505
- this._clientEvents.get(void 0)
506
- ].filter(isDefined);
507
- }
508
- getAssociatedEventEmitters(clientName) {
509
- return clientName ? [this.buildAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
510
- }
511
- transferListeners(oldProvider, newProvider, clientName, emitters) {
512
- var _a;
513
- (_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
514
- var _a2;
515
- return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
516
- });
517
- const newClientHandlers = Object.values(ProviderEvents).map((eventType) => {
518
- const handler = (details) => __async(this, null, function* () {
519
- emitters.forEach((emitter) => {
520
- emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
521
- });
522
- this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
523
- });
524
- return [eventType, handler];
525
- });
526
- this._clientEventHandlers.set(clientName, newClientHandlers);
527
- newClientHandlers.forEach((eventHandler) => {
528
- var _a2;
529
- return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
530
- });
531
- }
532
- close() {
533
- return __async(this, null, function* () {
534
- var _a, _b;
535
- try {
536
- yield (_b = (_a = this == null ? void 0 : this._defaultProvider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
537
- } catch (err) {
538
- this.handleShutdownError(this._defaultProvider, err);
539
- }
540
- const providers = Array.from(this._clientProviders);
541
- yield Promise.all(
542
- providers.map((_0) => __async(this, [_0], function* ([, provider]) {
543
- var _a2;
544
- try {
545
- yield (_a2 = provider.onClose) == null ? void 0 : _a2.call(provider);
546
- } catch (err) {
547
- this.handleShutdownError(this._defaultProvider, err);
548
- }
549
- }))
550
- );
551
- });
552
- }
553
- handleShutdownError(provider, err) {
554
- this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);
555
- this._logger.error(err == null ? void 0 : err.stack);
556
- }
557
- setTransactionContextPropagator(transactionContextPropagator) {
558
- const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
559
- if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
560
- this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
561
- } else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
562
- this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
563
- } else {
564
- this._transactionContextPropagator = transactionContextPropagator;
565
- }
566
- return this;
567
- }
568
- setTransactionContext(transactionContext, callback, ...args) {
569
- this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
570
- }
571
- getTransactionContext() {
572
- try {
573
- return this._transactionContextPropagator.getTransactionContext();
574
- } catch (err) {
575
- const error = err;
576
- this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
577
- this._logger.error(error == null ? void 0 : error.stack);
578
- return {};
579
- }
580
- }
581
- };
41
+ // src/client/open-feature-client.ts
42
+ import {
43
+ ErrorCode as ErrorCode2,
44
+ SafeLogger,
45
+ StandardResolutionReasons as StandardResolutionReasons2,
46
+ statusMatchesEvent
47
+ } from "@openfeature/core";
582
48
 
583
49
  // src/provider/no-op-provider.ts
50
+ import { ProviderStatus } from "@openfeature/core";
584
51
  var REASON_NO_OP = "No-op";
585
52
  var NoopFeatureProvider = class {
586
53
  constructor() {
@@ -589,7 +56,7 @@ var NoopFeatureProvider = class {
589
56
  };
590
57
  }
591
58
  get status() {
592
- return "NOT_READY" /* NOT_READY */;
59
+ return ProviderStatus.NOT_READY;
593
60
  }
594
61
  resolveBooleanEvaluation(_, defaultValue) {
595
62
  return this.noOp(defaultValue);
@@ -612,13 +79,25 @@ var NoopFeatureProvider = class {
612
79
  };
613
80
  var NOOP_PROVIDER = new NoopFeatureProvider();
614
81
 
82
+ // src/provider/in-memory-provider/in-memory-provider.ts
83
+ import {
84
+ FlagNotFoundError,
85
+ GeneralError,
86
+ OpenFeatureError as OpenFeatureError2,
87
+ OpenFeatureEventEmitter,
88
+ ProviderEvents,
89
+ StandardResolutionReasons,
90
+ TypeMismatchError
91
+ } from "@openfeature/core";
92
+
615
93
  // src/provider/in-memory-provider/variant-not-found-error.ts
94
+ import { ErrorCode, OpenFeatureError } from "@openfeature/core";
616
95
  var VariantFoundError = class extends OpenFeatureError {
617
96
  constructor(message) {
618
97
  super(message);
619
98
  Object.setPrototypeOf(this, VariantFoundError.prototype);
620
99
  this.name = "VariantFoundError";
621
- this.code = "GENERAL" /* GENERAL */;
100
+ this.code = ErrorCode.GENERAL;
622
101
  }
623
102
  };
624
103
 
@@ -639,7 +118,7 @@ var InMemoryProvider = class {
639
118
  putConfiguration(flagConfiguration) {
640
119
  const flagsChanged = Object.entries(flagConfiguration).filter(([key, value]) => this._flagConfiguration[key] !== value).map(([key]) => key);
641
120
  this._flagConfiguration = __spreadValues({}, flagConfiguration);
642
- this.events.emit("PROVIDER_CONFIGURATION_CHANGED" /* ConfigurationChanged */, { flagsChanged });
121
+ this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });
643
122
  }
644
123
  resolveBooleanEvaluation(flagKey, defaultValue, context, logger) {
645
124
  return this.resolveFlagWithReason(flagKey, defaultValue, context, logger);
@@ -666,7 +145,7 @@ var InMemoryProvider = class {
666
145
  }
667
146
  return resolutionResult;
668
147
  } catch (error) {
669
- if (!(error instanceof OpenFeatureError)) {
148
+ if (!(error instanceof OpenFeatureError2)) {
670
149
  throw new GeneralError((error == null ? void 0 : error.message) || "unknown error");
671
150
  }
672
151
  throw error;
@@ -700,13 +179,31 @@ var InMemoryProvider = class {
700
179
  }
701
180
  };
702
181
 
182
+ // src/open-feature.ts
183
+ import {
184
+ OpenFeatureCommonAPI,
185
+ objectOrUndefined,
186
+ stringOrUndefined
187
+ } from "@openfeature/core";
188
+
189
+ // src/transaction-context/no-op-transaction-context-propagator.ts
190
+ var NoopTransactionContextPropagator = class {
191
+ getTransactionContext() {
192
+ return {};
193
+ }
194
+ setTransactionContext(_, callback) {
195
+ callback();
196
+ }
197
+ };
198
+ var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
199
+
703
200
  // src/open-feature.ts
704
201
  var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/js-sdk/api");
705
202
  var _globalThis = globalThis;
706
203
  var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
707
- // eslint-disable-next-line @typescript-eslint/no-empty-function
708
204
  constructor() {
709
205
  super("server");
206
+ this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
710
207
  this._defaultProvider = NOOP_PROVIDER;
711
208
  }
712
209
  /**
@@ -743,6 +240,37 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
743
240
  context
744
241
  );
745
242
  }
243
+ /**
244
+ * Clears all registered providers and resets the default provider.
245
+ * @returns {Promise<void>}
246
+ */
247
+ clearProviders() {
248
+ return super.clearProvidersAndSetDefault(NOOP_PROVIDER);
249
+ }
250
+ setTransactionContextPropagator(transactionContextPropagator) {
251
+ const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
252
+ if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
253
+ this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
254
+ } else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
255
+ this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
256
+ } else {
257
+ this._transactionContextPropagator = transactionContextPropagator;
258
+ }
259
+ return this;
260
+ }
261
+ setTransactionContext(transactionContext, callback, ...args) {
262
+ this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
263
+ }
264
+ getTransactionContext() {
265
+ try {
266
+ return this._transactionContextPropagator.getTransactionContext();
267
+ } catch (err) {
268
+ const error = err;
269
+ this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
270
+ this._logger.error(error == null ? void 0 : error.stack);
271
+ return {};
272
+ }
273
+ }
746
274
  };
747
275
  var OpenFeature = OpenFeatureAPI.getInstance();
748
276
 
@@ -889,13 +417,13 @@ var OpenFeatureClient = class {
889
417
  return evaluationDetails;
890
418
  } catch (err) {
891
419
  const errorMessage = err == null ? void 0 : err.message;
892
- const errorCode = (err == null ? void 0 : err.code) || "GENERAL" /* GENERAL */;
420
+ const errorCode = (err == null ? void 0 : err.code) || ErrorCode2.GENERAL;
893
421
  yield this.errorHooks(allHooksReversed, hookContext, err, options);
894
422
  return {
895
423
  errorCode,
896
424
  errorMessage,
897
425
  value: defaultValue,
898
- reason: StandardResolutionReasons.ERROR,
426
+ reason: StandardResolutionReasons2.ERROR,
899
427
  flagMetadata: Object.freeze({}),
900
428
  flagKey
901
429
  };
@@ -961,34 +489,15 @@ var OpenFeatureClient = class {
961
489
  return this._clientLogger || this.globalLogger();
962
490
  }
963
491
  };
492
+
493
+ // src/index.ts
494
+ export * from "@openfeature/core";
964
495
  export {
965
- DefaultLogger,
966
- ErrorCode,
967
- FlagNotFoundError,
968
- GeneralError,
969
496
  InMemoryProvider,
970
- InternalEventEmitter,
971
- InvalidContextError,
972
- LOG_LEVELS,
973
497
  NOOP_PROVIDER,
974
498
  NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
975
499
  OpenFeature,
976
500
  OpenFeatureAPI,
977
- OpenFeatureClient,
978
- OpenFeatureCommonAPI,
979
- OpenFeatureError,
980
- OpenFeatureEventEmitter,
981
- ParseError,
982
- ProviderEvents,
983
- ProviderStatus,
984
- SafeLogger,
985
- StandardResolutionReasons,
986
- TargetingKeyMissingError,
987
- TypeMismatchError,
988
- isObject,
989
- isString,
990
- objectOrUndefined,
991
- statusMatchesEvent,
992
- stringOrUndefined
501
+ OpenFeatureClient
993
502
  };
994
503
  //# sourceMappingURL=index.js.map