@openfeature/web-sdk 0.3.7-experimental → 0.3.9-experimental

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/types.d.ts CHANGED
@@ -20,13 +20,28 @@ declare enum ProviderEvents {
20
20
  type EventMetadata = {
21
21
  [key: string]: string | boolean | number;
22
22
  };
23
- type EventDetails = {
23
+ type CommonEventDetails = {
24
24
  clientName?: string;
25
+ };
26
+ type CommonEventProps = {
25
27
  message?: string;
26
- flagsChanged?: string[];
27
28
  metadata?: EventMetadata;
28
29
  };
29
- type EventHandler = (eventDetails?: EventDetails) => Promise<unknown> | unknown;
30
+ type ReadyEvent = CommonEventProps;
31
+ type ErrorEvent = CommonEventProps;
32
+ type StaleEvent = CommonEventProps;
33
+ type ConfigChangeEvent = CommonEventProps & {
34
+ flagsChanged?: string[];
35
+ };
36
+ type EventMap = {
37
+ [ProviderEvents.Ready]: ReadyEvent;
38
+ [ProviderEvents.Error]: ErrorEvent;
39
+ [ProviderEvents.Stale]: StaleEvent;
40
+ [ProviderEvents.ConfigurationChanged]: ConfigChangeEvent;
41
+ };
42
+ type EventContext<T extends ProviderEvents, U extends Record<string, unknown> = Record<string, unknown>> = EventMap[T] & U;
43
+ type EventDetails<T extends ProviderEvents> = EventContext<T> & CommonEventDetails;
44
+ type EventHandler<T extends ProviderEvents> = (eventDetails?: EventDetails<T>) => Promise<unknown> | unknown;
30
45
  interface Eventing {
31
46
  /**
32
47
  * Adds a handler for the given provider event type.
@@ -34,19 +49,19 @@ interface Eventing {
34
49
  * @param {ProviderEvents} eventType The provider event type to listen to
35
50
  * @param {EventHandler} handler The handler to run on occurrence of the event type
36
51
  */
37
- addHandler(eventType: ProviderEvents, handler: EventHandler): void;
52
+ addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void;
38
53
  /**
39
54
  * Removes a handler for the given provider event type.
40
55
  * @param {ProviderEvents} eventType The provider event type to remove the listener for
41
56
  * @param {EventHandler} handler The handler to remove for the provider event type
42
57
  */
43
- removeHandler(eventType: ProviderEvents, handler: EventHandler): void;
58
+ removeHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void;
44
59
  /**
45
60
  * Gets the current handlers for the given provider event type.
46
61
  * @param {ProviderEvents} eventType The provider event type to get the current handlers for
47
62
  * @returns {EventHandler[]} The handlers currently attached to the given provider event type
48
63
  */
49
- getHandlers(eventType: ProviderEvents): EventHandler[];
64
+ getHandlers<T extends ProviderEvents>(eventType: T): EventHandler<T>[];
50
65
  }
51
66
 
52
67
  interface Logger {
@@ -87,20 +102,36 @@ declare class SafeLogger implements Logger {
87
102
  private log;
88
103
  }
89
104
 
90
- declare class OpenFeatureEventEmitter implements ManageLogger<OpenFeatureEventEmitter> {
105
+ declare abstract class GenericEventEmitter<AdditionalContext extends Record<string, unknown> = Record<string, unknown>> implements ManageLogger<GenericEventEmitter<AdditionalContext>> {
91
106
  private readonly globalLogger?;
92
107
  private readonly _handlers;
93
108
  private readonly eventEmitter;
94
109
  private _eventLogger?;
95
110
  constructor(globalLogger?: (() => Logger) | undefined);
96
- emit(eventType: ProviderEvents, context?: EventDetails): void;
97
- addHandler(eventType: ProviderEvents, handler: EventHandler): void;
98
- removeHandler(eventType: ProviderEvents, handler: EventHandler): void;
111
+ emit<T extends ProviderEvents>(eventType: T, context?: EventContext<T, AdditionalContext>): void;
112
+ addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void;
113
+ removeHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void;
99
114
  removeAllHandlers(eventType?: ProviderEvents): void;
100
- getHandlers(eventType: ProviderEvents): EventHandler[];
115
+ getHandlers<T extends ProviderEvents>(eventType: T): EventHandler<T>[];
101
116
  setLogger(logger: Logger): this;
102
117
  private get _logger();
103
118
  }
119
+ /**
120
+ * The OpenFeatureEventEmitter can be used by provider developers to emit
121
+ * events at various parts of the provider lifecycle.
122
+ *
123
+ * NOTE: Ready and error events are automatically emitted by the SDK based on
124
+ * the result of the initialize method.
125
+ */
126
+ declare class OpenFeatureEventEmitter extends GenericEventEmitter {
127
+ }
128
+ /**
129
+ * The InternalEventEmitter should only be used within the SDK. It extends the
130
+ * OpenFeatureEventEmitter to include additional properties that can be included
131
+ * in the event details.
132
+ */
133
+ declare class InternalEventEmitter extends GenericEventEmitter<CommonEventDetails> {
134
+ }
104
135
 
105
136
  interface Metadata {
106
137
  }
@@ -235,26 +266,53 @@ interface ManageContext<T> {
235
266
  setContext(context: EvaluationContext): T;
236
267
  }
237
268
 
269
+ /**
270
+ * The state of the provider.
271
+ */
238
272
  declare enum ProviderStatus {
273
+ /**
274
+ * The provider has not been initialized and cannot yet evaluate flags.
275
+ */
239
276
  NOT_READY = "NOT_READY",
277
+ /**
278
+ * The provider is ready to resolve flags.
279
+ */
240
280
  READY = "READY",
281
+ /**
282
+ * The provider is in an error state and unable to evaluate flags.
283
+ */
241
284
  ERROR = "ERROR"
242
285
  }
286
+ /**
287
+ * Static data about the provider.
288
+ */
243
289
  interface ProviderMetadata extends Metadata {
244
290
  readonly name: string;
245
291
  }
246
292
  interface CommonProvider {
247
293
  readonly metadata: ProviderMetadata;
294
+ /**
295
+ * Returns a representation of the current readiness of the provider.
296
+ * If the provider needs to be initialized, it should return {@link ProviderStatus.READY}.
297
+ * If the provider is in an error state, it should return {@link ProviderStatus.ERROR}.
298
+ * If the provider is functioning normally, it should return {@link ProviderStatus.NOT_READY}.
299
+ *
300
+ * _Providers which do not implement this method are assumed to be ready immediately._
301
+ */
248
302
  readonly status?: ProviderStatus;
249
303
  /**
250
304
  * An event emitter for ProviderEvents.
251
305
  * @see ProviderEvents
252
306
  */
253
307
  events?: OpenFeatureEventEmitter;
308
+ /**
309
+ * A function used to shut down the provider.
310
+ * Called when this provider is replaced with a new one, or when the OpenFeature is shut down.
311
+ */
254
312
  onClose?(): Promise<void>;
255
313
  /**
256
- * A handler function used to setup the provider.
257
- * Called by the SDK after the provider is set.
314
+ * A function used to setup the provider.
315
+ * Called by the SDK after the provider is set if the provider's status is {@link ProviderStatus.NOT_READY}.
258
316
  * When the returned promise resolves, the SDK fires the ProviderEvents.Ready event.
259
317
  * If the returned promise rejects, the SDK fires the ProviderEvents.Error event.
260
318
  * Use this function to perform any context-dependent setup within the provider.
@@ -460,7 +518,7 @@ declare abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonPro
460
518
  private readonly _events;
461
519
  private readonly _clientEventHandlers;
462
520
  protected _clientProviders: Map<string, P>;
463
- protected _clientEvents: Map<string | undefined, OpenFeatureEventEmitter>;
521
+ protected _clientEvents: Map<string | undefined, InternalEventEmitter>;
464
522
  addHooks(...hooks: Hook<FlagValue>[]): this;
465
523
  getHooks(): Hook<FlagValue>[];
466
524
  clearHooks(): this;
@@ -477,19 +535,19 @@ declare abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonPro
477
535
  * @param {ProviderEvents} eventType The provider event type to listen to
478
536
  * @param {EventHandler} handler The handler to run on occurrence of the event type
479
537
  */
480
- addHandler(eventType: ProviderEvents, handler: EventHandler): void;
538
+ addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void;
481
539
  /**
482
540
  * Removes a handler for the given provider event type.
483
541
  * @param {ProviderEvents} eventType The provider event type to remove the listener for
484
542
  * @param {EventHandler} handler The handler to remove for the provider event type
485
543
  */
486
- removeHandler(eventType: ProviderEvents, handler: EventHandler): void;
544
+ removeHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void;
487
545
  /**
488
546
  * Gets the current handlers for the given provider event type.
489
547
  * @param {ProviderEvents} eventType The provider event type to get the current handlers for
490
548
  * @returns {EventHandler[]} The handlers currently attached to the given provider event type
491
549
  */
492
- getHandlers(eventType: ProviderEvents): EventHandler[];
550
+ getHandlers<T extends ProviderEvents>(eventType: T): EventHandler<T>[];
493
551
  /**
494
552
  * Sets the default provider for flag evaluations.
495
553
  * This provider will be used by unnamed clients and named clients to which no provider is bound.
@@ -509,8 +567,9 @@ declare abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonPro
509
567
  */
510
568
  setProvider(clientName: string, provider: P): this;
511
569
  protected getProviderForClient(name?: string): P;
512
- protected getAndCacheEventEmitterForClient(name?: string): OpenFeatureEventEmitter;
570
+ protected buildAndCacheEventEmitterForClient(name?: string): InternalEventEmitter;
513
571
  private getUnboundEmitters;
572
+ private getAssociatedEventEmitters;
514
573
  private transferListeners;
515
574
  close(): Promise<void>;
516
575
  private handleShutdownError;
@@ -674,13 +733,13 @@ declare class OpenFeatureClient implements Client {
674
733
  private _clientLogger?;
675
734
  constructor(providerAccessor: () => Provider, emitterAccessor: () => OpenFeatureEventEmitter, globalLogger: () => Logger, options: OpenFeatureClientOptions);
676
735
  get metadata(): ClientMetadata;
677
- addHandler(eventType: ProviderEvents, handler: EventHandler): void;
678
- removeHandler(notificationType: ProviderEvents, handler: EventHandler): void;
679
- getHandlers(eventType: ProviderEvents): EventHandler[];
680
- setLogger(logger: Logger): OpenFeatureClient;
681
- addHooks(...hooks: Hook<FlagValue>[]): OpenFeatureClient;
736
+ addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void;
737
+ removeHandler<T extends ProviderEvents>(notificationType: T, handler: EventHandler<T>): void;
738
+ getHandlers(eventType: ProviderEvents): EventHandler<ProviderEvents>[];
739
+ setLogger(logger: Logger): this;
740
+ addHooks(...hooks: Hook<FlagValue>[]): this;
682
741
  getHooks(): Hook<FlagValue>[];
683
- clearHooks(): OpenFeatureClient;
742
+ clearHooks(): this;
684
743
  getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean;
685
744
  getBooleanDetails(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): EvaluationDetails<boolean>;
686
745
  getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T;
@@ -728,4 +787,4 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider> implements M
728
787
  */
729
788
  declare const OpenFeature: OpenFeatureAPI;
730
789
 
731
- export { BeforeHookContext, Client, ClientMetadata, CommonProvider, DefaultLogger, ErrorCode, EvaluationContext, EvaluationContextValue, EvaluationDetails, EvaluationLifeCycle, EventDetails, EventHandler, EventMetadata, Eventing, Features, FlagEvaluationOptions, FlagMetadata, FlagNotFoundError, FlagValue, FlagValueType, GeneralError, Hook, HookContext, HookHints, InvalidContextError, JsonArray, JsonObject, JsonValue, LOG_LEVELS, Logger, ManageContext, ManageLogger, ManageTransactionContextPropagator, Metadata, NOOP_PROVIDER, NOOP_TRANSACTION_CONTEXT_PROPAGATOR, OpenFeature, OpenFeatureAPI, OpenFeatureClient, OpenFeatureCommonAPI, OpenFeatureError, OpenFeatureEventEmitter, ParseError, PrimitiveValue, Provider, ProviderEvents, ProviderMetadata, ProviderStatus, ResolutionDetails, ResolutionReason, SafeLogger, StandardResolutionReasons, TargetingKeyMissingError, TransactionContext, TransactionContextPropagator, TypeMismatchError, isObject, isString, objectOrUndefined, stringOrUndefined };
790
+ export { BeforeHookContext, Client, ClientMetadata, CommonEventDetails, CommonProvider, ConfigChangeEvent, DefaultLogger, ErrorCode, ErrorEvent, EvaluationContext, EvaluationContextValue, EvaluationDetails, EvaluationLifeCycle, EventContext, EventDetails, EventHandler, EventMetadata, Eventing, Features, FlagEvaluationOptions, FlagMetadata, FlagNotFoundError, FlagValue, FlagValueType, GeneralError, Hook, HookContext, HookHints, InternalEventEmitter, InvalidContextError, JsonArray, JsonObject, JsonValue, LOG_LEVELS, Logger, ManageContext, ManageLogger, ManageTransactionContextPropagator, Metadata, NOOP_PROVIDER, NOOP_TRANSACTION_CONTEXT_PROPAGATOR, OpenFeature, OpenFeatureAPI, OpenFeatureClient, OpenFeatureCommonAPI, OpenFeatureError, OpenFeatureEventEmitter, ParseError, PrimitiveValue, Provider, ProviderEvents, ProviderMetadata, ProviderStatus, ReadyEvent, ResolutionDetails, ResolutionReason, SafeLogger, StaleEvent, StandardResolutionReasons, TargetingKeyMissingError, TransactionContext, TransactionContextPropagator, TypeMismatchError, isObject, isString, objectOrUndefined, stringOrUndefined };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfeature/web-sdk",
3
- "version": "0.3.7-experimental",
3
+ "version": "0.3.9-experimental",
4
4
  "description": "OpenFeature SDK for Web",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "files": [