@featbit/js-client-sdk 3.0.2 → 3.0.3
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/FbClientBuilder.d.ts +1 -1
- package/dist/esm/FbClientBuilder.d.ts.map +1 -1
- package/dist/esm/FbClientBuilder.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/umd/{featbit-js-client-sdk-3.0.2.js → featbit-js-client-sdk-3.0.3.js} +2 -2
- package/dist/umd/featbit-js-client-sdk-3.0.3.js.map +1 -0
- package/dist/umd/featbit-js-client-sdk.js +1 -1
- package/dist/umd/featbit-js-client-sdk.js.map +1 -1
- package/package.json +1 -1
- package/src/FbClientBuilder.ts +1 -1
- package/src/version.ts +1 -1
- package/dist/umd/featbit-js-client-sdk-3.0.2.js.map +0 -1
package/package.json
CHANGED
package/src/FbClientBuilder.ts
CHANGED
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = "3.0.
|
|
1
|
+
export const version = "3.0.3"; export const name = "@featbit/js-client-sdk";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"featbit-js-client-sdk-3.0.2.js","mappings":"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","sources":["webpack://@featbit/js-client-sdk/webpack/universalModuleDefinition","webpack://@featbit/js-client-sdk/./src/Configuration.ts","webpack://@featbit/js-client-sdk/./src/Context.ts","webpack://@featbit/js-client-sdk/./src/FbClientBuilder.ts","webpack://@featbit/js-client-sdk/./src/FbClientCore.ts","webpack://@featbit/js-client-sdk/./src/bootstrap/JsonBootstrapProvider.ts","webpack://@featbit/js-client-sdk/./src/bootstrap/NullBootstrapProvider.ts","webpack://@featbit/js-client-sdk/./src/bootstrap/index.ts","webpack://@featbit/js-client-sdk/./src/constants.ts","webpack://@featbit/js-client-sdk/./src/data-sources/DataSourceUpdates.ts","webpack://@featbit/js-client-sdk/./src/data-sources/createStreamListeners.ts","webpack://@featbit/js-client-sdk/./src/data-sources/index.ts","webpack://@featbit/js-client-sdk/./src/data-sync/DataSyncMode.ts","webpack://@featbit/js-client-sdk/./src/data-sync/NullDataSynchronizer.ts","webpack://@featbit/js-client-sdk/./src/data-sync/PollingDataSynchronizer.ts","webpack://@featbit/js-client-sdk/./src/data-sync/Requestor.ts","webpack://@featbit/js-client-sdk/./src/data-sync/WebSocketDataSynchronizer.ts","webpack://@featbit/js-client-sdk/./src/data-sync/index.ts","webpack://@featbit/js-client-sdk/./src/data-sync/types.ts","webpack://@featbit/js-client-sdk/./src/data-sync/utils.ts","webpack://@featbit/js-client-sdk/./src/errors.ts","webpack://@featbit/js-client-sdk/./src/evaluation/EvalResult.ts","webpack://@featbit/js-client-sdk/./src/evaluation/Evaluator.ts","webpack://@featbit/js-client-sdk/./src/evaluation/ReasonKinds.ts","webpack://@featbit/js-client-sdk/./src/evaluation/data/IFlag.ts","webpack://@featbit/js-client-sdk/./src/evaluation/data/index.ts","webpack://@featbit/js-client-sdk/./src/evaluation/index.ts","webpack://@featbit/js-client-sdk/./src/events/DefaultEventProcessor.ts","webpack://@featbit/js-client-sdk/./src/events/DefaultEventQueue.ts","webpack://@featbit/js-client-sdk/./src/events/DefaultEventSender.ts","webpack://@featbit/js-client-sdk/./src/events/DefaultEventSerializer.ts","webpack://@featbit/js-client-sdk/./src/events/EventDispatcher.ts","webpack://@featbit/js-client-sdk/./src/events/IEventSender.ts","webpack://@featbit/js-client-sdk/./src/events/NullEventProcessor.ts","webpack://@featbit/js-client-sdk/./src/events/event.ts","webpack://@featbit/js-client-sdk/./src/events/index.ts","webpack://@featbit/js-client-sdk/./src/index.ts","webpack://@featbit/js-client-sdk/./src/logging/BasicLogger.ts","webpack://@featbit/js-client-sdk/./src/logging/SafeLogger.ts","webpack://@featbit/js-client-sdk/./src/logging/format.ts","webpack://@featbit/js-client-sdk/./src/logging/index.ts","webpack://@featbit/js-client-sdk/./src/options/ClientContext.ts","webpack://@featbit/js-client-sdk/./src/options/OptionMessages.ts","webpack://@featbit/js-client-sdk/./src/options/UserBuilder.ts","webpack://@featbit/js-client-sdk/./src/options/Validators.ts","webpack://@featbit/js-client-sdk/./src/options/index.ts","webpack://@featbit/js-client-sdk/./src/platform/browser/BrowserInfo.ts","webpack://@featbit/js-client-sdk/./src/platform/browser/BrowserPlatform.ts","webpack://@featbit/js-client-sdk/./src/platform/browser/BrowserRequests.ts","webpack://@featbit/js-client-sdk/./src/platform/browser/BrowserWebSocket.ts","webpack://@featbit/js-client-sdk/./src/platform/browser/FbClient.ts","webpack://@featbit/js-client-sdk/./src/platform/browser/LocalStorageStore.ts","webpack://@featbit/js-client-sdk/./src/platform/index.ts","webpack://@featbit/js-client-sdk/./src/store/BaseStore.ts","webpack://@featbit/js-client-sdk/./src/store/DataKinds.ts","webpack://@featbit/js-client-sdk/./src/store/InMemoryStore.ts","webpack://@featbit/js-client-sdk/./src/store/index.ts","webpack://@featbit/js-client-sdk/./src/store/serialization.ts","webpack://@featbit/js-client-sdk/./src/store/store.ts","webpack://@featbit/js-client-sdk/./src/utils/Emits.ts","webpack://@featbit/js-client-sdk/./src/utils/EventEmitter.ts","webpack://@featbit/js-client-sdk/./src/utils/ValueConverters.ts","webpack://@featbit/js-client-sdk/./src/utils/canonicalizeUri.ts","webpack://@featbit/js-client-sdk/./src/utils/debounce.ts","webpack://@featbit/js-client-sdk/./src/utils/http.ts","webpack://@featbit/js-client-sdk/./src/utils/index.ts","webpack://@featbit/js-client-sdk/./src/utils/isNullOrUndefined.ts","webpack://@featbit/js-client-sdk/./src/utils/serializeUser.ts","webpack://@featbit/js-client-sdk/./src/utils/sleep.ts","webpack://@featbit/js-client-sdk/./src/version.ts","webpack://@featbit/js-client-sdk/webpack/bootstrap","webpack://@featbit/js-client-sdk/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(this, () => {\nreturn ","import { IOptions } from \"./options/IOptions\";\nimport { ILogger } from \"./logging/ILogger\";\nimport { IValidatedOptions } from \"./options/IValidatedOptions\";\nimport { NumberWithMinimum, TypeValidator, TypeValidators, UserValidator } from \"./options/Validators\";\nimport OptionMessages from \"./options/OptionMessages\";\nimport { IStore } from \"./platform/IStore\";\nimport { IClientContext } from \"./options/IClientContext\";\nimport { IDataSynchronizer } from \"./data-sync/IDataSynchronizer\";\nimport { IDataSourceUpdates } from \"./store/IDataSourceUpdates\";\nimport InMemoryStore from \"./store/InMemoryStore\";\nimport { VoidFunction } from \"./utils/VoidFunction\";\nimport { isNullOrUndefined } from \"./utils/isNullOrUndefined\";\nimport { canonicalizeUri } from \"./utils/canonicalizeUri\";\nimport { IBootstrapProvider } from \"./bootstrap/IBootstrapProvider\";\nimport { NullBootstrapProvider } from \"./bootstrap/NullBootstrapProvider\";\nimport { EmptyString } from \"./constants\";\nimport { DataSyncModeEnum } from \"./data-sync/DataSyncMode\";\nimport { IUser } from \"./options/IUser\";\nimport { JsonBootstrapProvider } from \"./bootstrap\";\n\n// Once things are internal to the implementation of the SDK we can depend on\n// types. Calls to the SDK could contain anything without any regard to typing.\n// So, data we take from external sources must be normalized into something\n// that can be trusted.\n\n/**\n * These perform cursory validations. Complex objects are implemented with classes\n * and these should allow for conditional construction.\n */\nconst validations: Record<string, TypeValidator> = {\n startWaitTime: TypeValidators.Number,\n sdkKey: TypeValidators.String,\n pollingUri: TypeValidators.String,\n streamingUri: TypeValidators.String,\n eventsUri: TypeValidators.String,\n webSocketPingInterval: TypeValidators.Number,\n logger: TypeValidators.Object,\n store: TypeValidators.ObjectOrFactory,\n dataSynchronizer: TypeValidators.ObjectOrFactory,\n flushInterval: TypeValidators.Number,\n maxEventsInQueue: TypeValidators.Number,\n pollingInterval: TypeValidators.Number,\n offline: TypeValidators.Boolean,\n dataSyncMode: TypeValidators.String,\n bootstrap: TypeValidators.Bootstrap,\n user: TypeValidators.User\n};\n\n/**\n * @internal\n */\nexport const defaultValues: IValidatedOptions = {\n startWaitTime: 5000,\n sdkKey: '',\n pollingUri: '',\n streamingUri: '',\n eventsUri: '',\n dataSyncMode: DataSyncModeEnum.STREAMING,\n sendEvents: true,\n webSocketPingInterval: 18 * 1000,\n flushInterval: 2000,\n maxEventsInQueue: 10000,\n pollingInterval: 30000,\n offline: false,\n store: (options: IOptions) => new InMemoryStore(),\n bootstrap: undefined,\n user: undefined,\n};\n\nfunction validateTypesAndNames(options: IOptions): {\n errors: string[];\n validatedOptions: IValidatedOptions;\n} {\n let errors: string[] = [];\n const validatedOptions: IValidatedOptions = {...defaultValues};\n Object.keys(options).forEach((optionName) => {\n // We need to tell typescript it doesn't actually know what options are.\n // If we don't then it complains we are doing crazy things with it.\n const optionValue = (options as unknown as any)[optionName];\n const validator = validations[optionName];\n if (validator) {\n if (!validator.is(optionValue)) {\n if (validator.getType() === 'boolean') {\n errors.push(OptionMessages.wrongOptionTypeBoolean(optionName, typeof optionValue));\n validatedOptions[optionName] = !!optionValue;\n } else if (\n validator instanceof NumberWithMinimum &&\n TypeValidators.Number.is(optionValue)\n ) {\n const {min} = validator as NumberWithMinimum;\n errors.push(OptionMessages.optionBelowMinimum(optionName, optionValue, min));\n validatedOptions[optionName] = min;\n } else if (validator instanceof UserValidator) {\n errors = [...errors, ...validator.messages];\n validatedOptions[optionName] = defaultValues[optionName];\n } else {\n errors.push(\n OptionMessages.wrongOptionType(optionName, validator.getType(), typeof optionValue),\n );\n validatedOptions[optionName] = defaultValues[optionName];\n }\n } else {\n validatedOptions[optionName] = optionValue;\n }\n } else {\n options.logger?.warn(OptionMessages.unknownOption(optionName));\n }\n });\n return {errors, validatedOptions};\n}\n\nfunction validateEndpoints(options: IOptions, validatedOptions: IValidatedOptions) {\n const {streamingUri, pollingUri, eventsUri} = options;\n const streamingUriMissing = isNullOrUndefined(streamingUri) || streamingUri === EmptyString;\n const pollingUriMissing = isNullOrUndefined(pollingUri) || pollingUri === EmptyString;\n const eventsUriMissing = isNullOrUndefined(eventsUri) || eventsUri === EmptyString;\n\n if (!validatedOptions.offline && (eventsUriMissing || (streamingUriMissing && pollingUriMissing))) {\n if (eventsUriMissing) {\n validatedOptions.logger?.error(OptionMessages.partialEndpoint('eventsUri'));\n }\n\n if (validatedOptions.dataSyncMode === DataSyncModeEnum.STREAMING && streamingUriMissing) {\n validatedOptions.logger?.error(OptionMessages.partialEndpoint('streamingUri'));\n }\n\n if (validatedOptions.dataSyncMode === DataSyncModeEnum.POLLING && pollingUriMissing) {\n validatedOptions.logger?.error(OptionMessages.partialEndpoint('pollingUri'));\n }\n }\n}\n\nexport default class Configuration {\n public readonly startWaitTime: number;\n\n public readonly sdkKey: string;\n\n public readonly streamingUri: string;\n\n public readonly pollingUri: string;\n\n public readonly eventsUri: string;\n\n public readonly webSocketPingInterval: number;\n\n public readonly logger?: ILogger;\n\n public readonly flushInterval: number;\n\n public readonly maxEventsInQueue: number;\n\n public readonly pollingInterval: number;\n\n public readonly offline: boolean;\n\n public readonly dataSyncMode: DataSyncModeEnum;\n\n public readonly bootstrapProvider: IBootstrapProvider = new NullBootstrapProvider();\n\n public readonly user: IUser;\n\n public readonly storeFactory: (clientContext: IClientContext) => IStore;\n\n public readonly dataSynchronizerFactory?: (\n clientContext: IClientContext,\n store: IStore,\n dataSourceUpdates: IDataSourceUpdates,\n initSuccessHandler: VoidFunction,\n errorHandler?: (e: Error) => void,\n ) => IDataSynchronizer;\n\n constructor(options: IOptions = {}) {\n // The default will handle undefined, but not null.\n // Because we can be called from JS we need to be extra defensive.\n options = options || {};\n // If there isn't a valid logger from the platform, then logs would go nowhere.\n this.logger = options.logger;\n\n const {errors, validatedOptions} = validateTypesAndNames(options);\n errors.forEach((error) => {\n this.logger?.warn(error);\n });\n\n this.user = options.user!;\n\n validateEndpoints(options, validatedOptions);\n this.streamingUri = `${ canonicalizeUri(validatedOptions.streamingUri) }/streaming`;\n this.pollingUri = `${ canonicalizeUri(validatedOptions.pollingUri) }/api/public/sdk/client/latest-all`;\n this.eventsUri = `${ canonicalizeUri(validatedOptions.eventsUri) }/api/public/insight/track`;\n\n this.startWaitTime = validatedOptions.startWaitTime;\n\n this.sdkKey = validatedOptions.sdkKey;\n this.webSocketPingInterval = validatedOptions.webSocketPingInterval!;\n\n this.flushInterval = validatedOptions.flushInterval;\n this.maxEventsInQueue = validatedOptions.maxEventsInQueue;\n this.pollingInterval = validatedOptions.pollingInterval;\n\n this.offline = validatedOptions.offline;\n if (validatedOptions.bootstrap && validatedOptions.bootstrap.length > 0) {\n try {\n this.bootstrapProvider = new JsonBootstrapProvider(validatedOptions.bootstrap);\n } catch (_) {\n this.logger?.error('Failed to parse bootstrap JSON, use NullBootstrapProvider.');\n }\n }\n\n if (this.offline) {\n this.logger?.info('Offline mode enabled. No data synchronization with the FeatBit server will occur.');\n }\n\n this.dataSyncMode = validatedOptions.dataSyncMode;\n\n if (TypeValidators.Function.is(validatedOptions.dataSynchronizer)) {\n // @ts-ignore\n this.dataSynchronizerFactory = validatedOptions.dataSynchronizer;\n } else {\n // The processor is already created, just have the method return it.\n // @ts-ignore\n this.dataSynchronizerFactory = () => validatedOptions.dataSynchronizer;\n }\n\n if (TypeValidators.Function.is(validatedOptions.store)) {\n // @ts-ignore\n this.storeFactory = validatedOptions.store;\n } else {\n // The store is already created, just have the method return it.\n // @ts-ignore\n this.storeFactory = () => validatedOptions.store;\n }\n }\n}","import { IUser } from \"./options/IUser\";\n\nexport default class Context {\n private _user?: IUser;\n /**\n * Is this a valid context. If a valid context cannot be created, then this flag will be true.\n * The validity of a context should be tested before it is used.\n */\n public readonly valid: boolean;\n\n public readonly message?: string;\n\n /**\n * Contexts should be created using the static factory method {@link Context.fromUser}.\n *\n * The factory methods are static functions within the class because they access private\n * implementation details, so they cannot be free functions.\n */\n private constructor(valid: boolean, message?: string) {\n this.valid = valid;\n this.message = message;\n }\n\n public static fromUser(user: IUser): Context {\n if (!user) {\n return Context.contextForError('No user specified');\n }\n\n const {keyId, name} = user;\n\n if (keyId === undefined || keyId === null || keyId.trim() === '') {\n return Context.contextForError('key is mandatory');\n }\n\n const context = new Context(true);\n context._user = user;\n\n return context;\n }\n\n get user(): IUser {\n return this._user!;\n }\n\n get keyId(): string {\n return this._user!.keyId;\n }\n\n value(property: string): any {\n if (property === 'keyId') {\n return this._user?.keyId;\n } else if (property === 'name') {\n return this._user?.name;\n } else {\n return this._user?.customizedProperties?.find(x => x.name === property)?.value;\n }\n }\n\n private static contextForError(message: string) {\n return new Context(false, message);\n }\n}","import { IFbClient } from \"./IFbClient\";\nimport { IOptions } from \"./options/IOptions\";\nimport FbClient from \"./platform/browser/FbClient\";\nimport { IDataSynchronizer } from \"./data-sync/IDataSynchronizer\";\nimport { IClientContext } from \"./options/IClientContext\";\nimport { IDataSourceUpdates } from \"./store/IDataSourceUpdates\";\nimport { VoidFunction } from \"./utils/VoidFunction\";\nimport { ILogger } from \"./logging/ILogger\";\nimport { DataSyncModeEnum } from \"./data-sync/DataSyncMode\";\nimport { IUser } from \"./options/IUser\";\nimport { IFlagBase } from \"./evaluation\";\nimport { IPlatform } from \"./platform\";\n\n/**\n * Creates an instance of the FeatBit client.\n *\n * Applications should instantiate a single instance for the lifetime of the application.\n * The client will begin attempting to connect to FeatBit as soon as it is created. To\n * determine when it is ready to use, call {@link IFbClient.waitForInitialization}, or register an\n * event listener for the `\"ready\"` event using {@link IFbClient.on}.\n *\n * **Important:** Do **not** try to instantiate `FbClient` with its constructor\n * (`new FbClientNode()`); the SDK does not currently support\n * this.\n *\n * @return\n * The new {@link IFbClient} instance.\n */\nexport class FbClientBuilder {\n private _options: IOptions;\n private _platform: IPlatform | undefined;\n\n constructor(options?: IOptions) {\n this._options = options ?? {};\n }\n\n /**\n * Creates a new instance of the FeatBit client.\n */\n build(): IFbClient {\n return new FbClient(this._options);\n }\n\n platform(platform: IPlatform): FbClientBuilder {\n this._platform = platform;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.startWaitTime}.\n */\n startWaitTime(startWaitTime: number): FbClientBuilder {\n this._options.startWaitTime = startWaitTime;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.sdkKey}.\n */\n sdkKey(sdkKey: string): FbClientBuilder {\n this._options.sdkKey = sdkKey;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.user}.\n */\n user(user: IUser): FbClientBuilder {\n this._options.user = user;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.streamingUri}.\n */\n streamingUri(streamingUri: string): FbClientBuilder {\n this._options.streamingUri = streamingUri;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.pollingUri}.\n */\n pollingUri(pollingUri: string): FbClientBuilder {\n this._options.pollingUri = pollingUri;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.eventsUri}.\n */\n eventsUri(eventsUri: string): FbClientBuilder {\n this._options.eventsUri = eventsUri;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.dataSyncMode}.\n */\n dataSyncMode(mode: DataSyncModeEnum): FbClientBuilder {\n this._options.dataSyncMode = mode;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.pollingInterval}.\n */\n pollingInterval(pollingInterval: number): FbClientBuilder {\n this._options.pollingInterval = pollingInterval;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.flushInterval}.\n */\n flushInterval(flushInterval: number): FbClientBuilder {\n this._options.flushInterval = flushInterval;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.maxEventsInQueue}.\n */\n maxEventsInQueue(maxEventsInQueue: number): FbClientBuilder {\n this._options.maxEventsInQueue = maxEventsInQueue;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.logger}.\n */\n logger(logger: ILogger): FbClientBuilder {\n this._options.logger = logger;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.offline}.\n */\n offline(offline: boolean): FbClientBuilder {\n this._options.offline = offline;\n return this;\n }\n\n /**\n * Use the JsonBootstrapProvider.\n */\n bootstrap(flags: IFlagBase[]): FbClientBuilder {\n this._options.bootstrap = flags;\n return this;\n }\n\n /**\n * Refer to {@link IOptions.dataSynchronizer}.\n */\n dataSynchronizer(\n dataSynchronizer: IDataSynchronizer |\n ((\n clientContext: IClientContext,\n dataSourceUpdates: IDataSourceUpdates,\n initSuccessHandler: VoidFunction,\n errorHandler?: (e: Error) => void,\n ) => IDataSynchronizer)\n ): FbClientBuilder {\n this._options.dataSynchronizer = dataSynchronizer;\n return this;\n }\n}","import { IFbClientCore } from \"./IFbClientCore\";\nimport { IPlatform } from \"./platform/IPlatform\";\nimport Configuration from \"./Configuration\";\nimport { ILogger } from \"./logging/ILogger\";\nimport ClientContext from \"./options/ClientContext\";\nimport DataSourceUpdates from \"./data-sources/DataSourceUpdates\";\nimport { createStreamListeners } from \"./data-sources/createStreamListeners\";\nimport { IEvalDetail } from \"./evaluation/IEvalDetail\";\nimport WebSocketDataSynchronizer from \"./data-sync/WebSocketDataSynchronizer\";\nimport PollingDataSynchronizer from \"./data-sync/PollingDataSynchronizer\";\nimport Requestor from \"./data-sync/Requestor\";\nimport { IDataSynchronizer } from \"./data-sync/IDataSynchronizer\";\nimport DataKinds from \"./store/DataKinds\";\nimport Evaluator from \"./evaluation/Evaluator\";\nimport { ReasonKinds } from \"./evaluation/ReasonKinds\";\nimport { ClientError } from \"./errors\";\nimport Context from \"./Context\";\nimport { IConvertResult, ValueConverters } from \"./utils/ValueConverters\";\nimport { NullDataSynchronizer } from \"./data-sync/NullDataSynchronizer\";\nimport { IEventProcessor } from \"./events/IEventProcessor\";\nimport { NullEventProcessor } from \"./events/NullEventProcessor\";\nimport { DefaultEventProcessor } from \"./events/DefaultEventProcessor\";\nimport { IStore } from \"./platform/IStore\";\nimport { IOptions } from \"./options/IOptions\";\nimport { MetricEvent } from \"./events/event\";\nimport { DataSyncModeEnum } from \"./data-sync/DataSyncMode\";\nimport { IUser } from \"./options/IUser\";\nimport { UserValidator } from \"./options/Validators\";\n\nenum ClientState {\n Initializing,\n Initialized,\n Failed,\n}\n\nexport interface IClientCallbacks {\n onError: (err: Error) => void;\n onFailed: (err: Error) => void;\n onReady: () => void;\n // Called whenever flags change, if there are listeners.\n onUpdate: (keys: string[]) => void;\n // Method to check if event listeners have been registered.\n // If none are registered, then onUpdate will never be called.\n hasEventListeners: () => boolean;\n}\n\nexport class FbClientCore implements IFbClientCore {\n private state: ClientState = ClientState.Initializing;\n\n private store?: IStore;\n\n private dataSynchronizer?: IDataSynchronizer;\n\n private eventProcessor?: IEventProcessor;\n\n private evaluator?: Evaluator;\n\n private initResolve?: (value: IFbClientCore | PromiseLike<IFbClientCore>) => void;\n\n private initReject?: (err: Error) => void;\n\n private rejectionReason: Error | undefined;\n\n private initializedPromise?: Promise<IFbClientCore>;\n\n private config: Configuration;\n\n private dataSourceUpdates?: DataSourceUpdates;\n\n private onError: (err: Error) => void;\n\n private onFailed: (err: Error) => void;\n\n private onReady: () => void;\n\n logger?: ILogger;\n\n constructor(\n private options: IOptions,\n private platform: IPlatform,\n callbacks: IClientCallbacks\n ) {\n this.onError = callbacks.onError;\n this.onFailed = callbacks.onFailed;\n this.onReady = callbacks.onReady;\n\n const {onUpdate, hasEventListeners} = callbacks;\n const config = new Configuration(options);\n\n if (!config.sdkKey && !config.offline) {\n throw new Error('You must configure the client with an SDK key');\n }\n\n if (!config.user) {\n throw new Error('You must configure the client with a user');\n }\n\n this.config = config;\n this.logger = config.logger;\n\n this.init(platform, onUpdate, hasEventListeners);\n }\n\n private async init(platform: IPlatform, onUpdate: (keys: string[]) => void, hasEventListeners: () => boolean) {\n const clientContext = new ClientContext(this.config.sdkKey, this.config, platform);\n this.store = this.config.storeFactory(clientContext);\n await this.store.identify(this.config.user);\n this.dataSourceUpdates = new DataSourceUpdates(this.store, hasEventListeners, onUpdate);\n this.evaluator = new Evaluator(this.store);\n\n // use bootstrap provider to populate store\n await this.config.bootstrapProvider.populate(this.config.user.keyId, this.dataSourceUpdates);\n\n if (this.config.offline) {\n this.eventProcessor = new NullEventProcessor();\n this.dataSynchronizer = new NullDataSynchronizer();\n\n this.initSuccess();\n } else {\n this.eventProcessor = new DefaultEventProcessor(clientContext);\n\n const listeners = createStreamListeners(this.dataSourceUpdates, this.logger, {\n put: () => this.initSuccess(),\n patch: () => this.initSuccess()\n });\n\n const dataSynchronizer = this.config.dataSyncMode === DataSyncModeEnum.STREAMING\n ? new WebSocketDataSynchronizer(\n this.config.sdkKey,\n this.config.user,\n clientContext,\n platform.webSocket,\n () => this.store!.version,\n listeners,\n this.config.webSocketPingInterval\n )\n : new PollingDataSynchronizer(\n this.config,\n new Requestor(this.config.sdkKey, this.config, this.platform.info, this.platform.requests),\n () => this.store!.version,\n listeners,\n (e) => this.dataSourceErrorHandler(e),\n );\n\n this.dataSynchronizer = this.config.dataSynchronizerFactory?.(\n clientContext,\n this.store,\n this.dataSourceUpdates,\n () => this.initSuccess(),\n (e) => this.dataSourceErrorHandler(e),\n ) ?? dataSynchronizer;\n }\n\n this.start();\n }\n\n async identify(user: IUser) {\n const validator = new UserValidator();\n if (!validator.is(user)) {\n validator.messages.forEach((error: string) => {\n this.logger?.warn(error);\n });\n\n return;\n }\n\n this.store!.identify(user);\n this.dataSynchronizer!.identify(user);\n const [ flags ] = this.store!.all(DataKinds.Flags);\n if (Object.keys(flags).length === 0) {\n await this.config.bootstrapProvider.populate(user.keyId, this.dataSourceUpdates!);\n }\n }\n\n private start() {\n if (this.config.offline) {\n return;\n }\n\n this.dataSynchronizer!.start();\n setTimeout(() => {\n if (!this.initialized()) {\n const msg = `FbClient failed to start successfully within ${ this.config.startWaitTime } milliseconds. ` +\n 'This error usually indicates a connection issue with FeatBit or an invalid sdkKey.' +\n 'Please double-check your sdkKey and streamingUri/pollingUri configuration. ' +\n 'We will continue to initialize the FbClient, it still have a chance to get to work ' +\n 'if it\\'s a temporary network issue';\n\n const error = new Error(msg);\n this.state = ClientState.Failed;\n this.rejectionReason = error;\n this.initReject?.(error);\n\n return this.logger?.warn(msg);\n }\n }, this.config.startWaitTime);\n }\n\n initialized(): boolean {\n return this.state === ClientState.Initialized;\n }\n\n waitForInitialization(): Promise<IFbClientCore> {\n // An initialization promise is only created if someone is going to use that promise.\n // If we always created an initialization promise, and there was no call waitForInitialization\n // by the time the promise was rejected, then that would result in an unhandled promise\n // rejection.\n\n // Initialization promise was created by a previous call to waitForInitialization.\n if (this.initializedPromise) {\n return this.initializedPromise;\n }\n\n // Initialization completed before waitForInitialization was called, so we have completed\n // and there was no promise. So we make a resolved promise and return it.\n if (this.state === ClientState.Initialized) {\n this.initializedPromise = Promise.resolve(this);\n return this.initializedPromise;\n }\n\n // Initialization failed before waitForInitialization was called, so we have completed\n // and there was no promise. So we make a rejected promise and return it.\n if (this.state === ClientState.Failed) {\n this.initializedPromise = Promise.reject(this.rejectionReason);\n return this.initializedPromise;\n }\n\n if (!this.initializedPromise) {\n this.initializedPromise = new Promise((resolve, reject) => {\n this.initResolve = resolve;\n this.initReject = reject;\n });\n }\n return this.initializedPromise;\n }\n\n boolVariation(\n key: string,\n defaultValue: boolean\n ): boolean {\n return this.evaluateCore(key, defaultValue, ValueConverters.bool).value!;\n }\n\n boolVariationDetail(\n key: string,\n defaultValue: boolean\n ): IEvalDetail<boolean> {\n return this.evaluateCore(key, defaultValue, ValueConverters.bool);\n }\n\n jsonVariation(key: string, defaultValue: any): any {\n return this.evaluateCore(key, defaultValue, ValueConverters.json).value!;\n }\n\n jsonVariationDetail(key: string, defaultValue: any): IEvalDetail<any> {\n return this.evaluateCore(key, defaultValue, ValueConverters.json);\n }\n\n numberVariation(key: string, defaultValue: number): number {\n return this.evaluateCore(key, defaultValue, ValueConverters.number).value!;\n }\n\n numberVariationDetail(key: string, defaultValue: number): IEvalDetail<number> {\n return this.evaluateCore(key, defaultValue, ValueConverters.number);\n }\n\n stringVariation(key: string, defaultValue: string): string {\n return this.evaluateCore(key, defaultValue, ValueConverters.string).value!;\n }\n\n stringVariationDetail(key: string, defaultValue: string): IEvalDetail<string> {\n return this.evaluateCore(key, defaultValue, ValueConverters.string);\n }\n\n variation(key: string, defaultValue: string): string {\n return this.evaluateCore(key, defaultValue, ValueConverters.string).value!;\n }\n\n variationDetail(key: string, defaultValue: string): IEvalDetail<string> {\n return this.evaluateCore(key, defaultValue, ValueConverters.string);\n }\n\n getAllVariations(): Promise<IEvalDetail<string>[]> {\n const context = Context.fromUser(this.config.user);\n if (!context.valid) {\n const error = new ClientError(\n `${ context.message ?? 'User not valid;' } returning default value.`,\n );\n this.onError(error);\n\n return Promise.resolve([]);\n }\n\n const [flags, _] = this.store!.all(DataKinds.Flags);\n const result = Object.keys(flags).map(flagKey => {\n const evalResult = this.evaluator!.evaluate(flagKey);\n return {flagKey, kind: evalResult.kind, reason: evalResult.reason, value: evalResult.value?.variation};\n });\n\n return Promise.resolve(result);\n }\n\n async close(): Promise<void> {\n await this.eventProcessor!.close();\n this.dataSynchronizer?.close();\n this.store!.close();\n }\n\n track(eventName: string, metricValue?: number | undefined): void {\n const metricEvent = new MetricEvent(this.config.user, eventName, this.platform.info.appType, metricValue ?? 1);\n this.eventProcessor!.record(metricEvent);\n return;\n }\n\n async flush(callback?: (res: boolean) => void): Promise<boolean> {\n try {\n await this.eventProcessor!.flush();\n callback?.(true);\n return true;\n } catch (err) {\n callback?.(false);\n return false;\n }\n }\n\n evaluateCore<TValue>(\n flagKey: string,\n defaultValue: TValue,\n typeConverter: (value: string) => IConvertResult<TValue>\n ): IEvalDetail<TValue> {\n const context = Context.fromUser(this.config.user);\n if (!context.valid) {\n const error = new ClientError(\n `${ context.message ?? 'User not valid;' } returning default value.`,\n );\n this.onError(error);\n\n return {flagKey, kind: ReasonKinds.Error, reason: error.message, value: defaultValue};\n }\n\n const evalResult = this.evaluator!.evaluate(flagKey);\n\n if (evalResult.kind === ReasonKinds.FlagNotFound) {\n // flag not found, return default value\n const error = new ClientError(evalResult.reason!);\n this.onError(error);\n\n return {flagKey, kind: evalResult.kind, reason: evalResult.reason, value: defaultValue};\n }\n\n if (!this.initialized()) {\n this.logger?.warn(\n 'Variation called before FeatBit client initialization completed (did you wait for the' +\n \"'ready' event?)\",\n );\n } else {\n // send event\n this.eventProcessor!.record(evalResult.toEvalEvent(this.config.user));\n }\n\n const {isSucceeded, value} = typeConverter(evalResult.value?.variation!);\n return isSucceeded\n ? {flagKey, kind: evalResult.kind, reason: evalResult.reason, value}\n : {flagKey, kind: ReasonKinds.WrongType, reason: 'type mismatch', value: defaultValue};\n }\n\n private dataSourceErrorHandler(e: any) {\n const error =\n e.code === 401 ? new Error('Authentication failed. Double check your SDK key.') : e;\n\n this.onError(error);\n this.onFailed(error);\n\n if (!this.initialized()) {\n this.state = ClientState.Failed;\n this.rejectionReason = error;\n this.initReject?.(error);\n }\n }\n\n private initSuccess() {\n if (!this.initialized()) {\n this.state = ClientState.Initialized;\n this.logger?.info('FbClient started successfully.');\n this.initResolve?.(this);\n this.onReady();\n }\n }\n}\n","import { IBootstrapProvider } from \"./IBootstrapProvider\";\nimport { deserializeAll } from \"../store/serialization\";\nimport { IDataSourceUpdates } from \"../store/IDataSourceUpdates\";\nimport { IStoreDataStorage } from \"../store/store\";\nimport { isNullOrUndefined } from \"../utils/isNullOrUndefined\";\nimport { IFlag, IFlagBase } from \"../evaluation/data/IFlag\";\n\nexport class JsonBootstrapProvider implements IBootstrapProvider {\n private dataSet?: IStoreDataStorage;\n\n constructor(bootstrap: IFlagBase[]) {\n const flags: IFlag[] = (bootstrap || []).map((flag: IFlagBase) => ({...flag, variationOptions: flag.variationOptions || [{id: null, variation: flag.variation}]})) as IFlag[];\n\n const data = deserializeAll(flags);\n this.dataSet = {\n flags: data.flags,\n version: 0\n };\n }\n\n populate(userKeyId: string, dataSourceUpdates: IDataSourceUpdates, callback?: () => void): Promise<void> {\n return new Promise((resolve, reject) => {\n if (isNullOrUndefined(this.dataSet)) {\n return resolve();\n }\n\n const internalCallback = () => {\n resolve();\n callback?.();\n }\n\n dataSourceUpdates.init(userKeyId, this.dataSet!, internalCallback);\n });\n }\n}","import { IBootstrapProvider } from \"./IBootstrapProvider\";\nimport { IDataSourceUpdates } from \"../store/IDataSourceUpdates\";\nimport { IStoreDataStorage } from \"../store/store\";\n\nexport class NullBootstrapProvider implements IBootstrapProvider {\n private dataSet?: IStoreDataStorage;\n\n constructor() {\n this.dataSet = {\n flags: {},\n version: 0\n };\n }\n\n populate(userKeyId: string, dataSourceUpdates: IDataSourceUpdates, callback?: () => void): Promise<void> {\n return new Promise((resolve, reject) => {\n resolve();\n callback?.();\n });\n }\n}","export * from './IBootstrapProvider';\nexport * from './JsonBootstrapProvider';\nexport * from './NullBootstrapProvider';","export const EmptyString = '';\nexport const MinInt: number = 0x80000000;","import { IDataSourceUpdates } from \"../store/IDataSourceUpdates\";\nimport {\n IStoreDataStorage,\n IStoreItem,\n IKeyedStoreItem\n} from \"../store/store\";\nimport { IStore } from \"../platform/IStore\";\nimport { IDataKind } from \"../IDataKind\";\nimport DataKinds from \"../store/DataKinds\";\n\n/**\n * @internal\n */\nexport default class DataSourceUpdates implements IDataSourceUpdates {\n\n constructor(\n private readonly store: IStore,\n private readonly hasEventListeners: () => boolean,\n private readonly onChange: (keys: string[]) => void,\n ) {\n }\n\n init(userKeyId: string, allData: IStoreDataStorage, callback?: () => void): void {\n if (userKeyId !== this.store.user.keyId) {\n callback?.();\n return;\n }\n\n const checkForChanges = this.hasEventListeners();\n const doInit = async (oldData?: IStoreDataStorage) => {\n await this.store.init(allData);\n Promise.resolve().then(() => {\n if (checkForChanges) {\n const updatedKeys = Object.keys(allData)\n .flatMap((namespace) => {\n const oldDataForKind = oldData?.[namespace] || {};\n const newDataForKind = allData[namespace];\n const mergedData = {...oldDataForKind, ...newDataForKind};\n return Object.keys(mergedData)\n .filter((key: string) => this.isUpdated(oldDataForKind && oldDataForKind[key], newDataForKind && newDataForKind[key]));\n });\n updatedKeys.length > 0 && this.onChange(updatedKeys);\n }\n });\n callback?.();\n };\n\n if (checkForChanges) {\n const [flags, version] = this.store.all(DataKinds.Flags);\n const oldData = {\n flags,\n version\n };\n doInit(oldData);\n } else {\n doInit();\n }\n }\n\n upsert(userKeyId: string, kind: IDataKind, data: IKeyedStoreItem, callback: () => void): void {\n if (userKeyId !== this.store.user.keyId) {\n callback?.();\n return;\n }\n\n const {key} = data;\n const checkForChanges = this.hasEventListeners();\n const doUpsert = async (oldItem?: IStoreItem) => {\n await this.store.upsert(kind, data);\n Promise.resolve().then(() => {\n if (checkForChanges && this.isUpdated(oldItem, data[key])) {\n this.onChange([key]);\n }\n });\n\n callback?.();\n };\n if (checkForChanges) {\n const item = this.store.get(kind, key);\n doUpsert(item || undefined);\n } else {\n doUpsert();\n }\n }\n\n private isUpdated(oldData?: IStoreItem, newData?: IStoreItem): boolean {\n return !oldData || !newData || newData.version > oldData.version\n }\n}","import { IDataSourceUpdates } from \"../store/IDataSourceUpdates\";\nimport { ILogger } from \"../logging/ILogger\";\nimport { VoidFunction } from \"../utils/VoidFunction\";\nimport {\n deserializeAll,\n deserializePatch,\n IPatchData,\n Flags\n} from \"../store/serialization\";\nimport DataKinds from \"../store/DataKinds\";\nimport { IStoreDataStorage } from \"../store/store\";\nimport { EventName, ProcessStreamResponse } from \"../data-sync/types\";\n\nexport const createPutListener = (\n dataSourceUpdates: IDataSourceUpdates,\n logger?: ILogger,\n onPutCompleteHandler: VoidFunction = () => {\n },\n) => ({\n deserializeData: deserializeAll,\n processJson: async (userKeyId: string, {flags}: Flags) => {\n const initData: IStoreDataStorage = {\n flags: flags,\n version: 0\n };\n\n logger?.debug('Initializing all data');\n dataSourceUpdates.init(userKeyId, initData, onPutCompleteHandler);\n },\n});\n\nexport const createPatchListener = (\n dataSourceUpdates: IDataSourceUpdates,\n logger?: ILogger,\n onPatchCompleteHandler: VoidFunction = () => {\n },\n) => ({\n deserializeData: deserializePatch,\n processJson: async (userKeyId: string, data: IPatchData[]) => {\n if (data?.length === 0) {\n onPatchCompleteHandler?.();\n return;\n }\n\n data?.forEach(item => {\n logger?.debug(`Updating ${ item.data.key } in ${ item.kind.namespace }`);\n dataSourceUpdates.upsert(userKeyId, item.kind, item.data, onPatchCompleteHandler);\n })\n },\n});\n\n\nexport const createStreamListeners = (\n dataSourceUpdates: IDataSourceUpdates,\n logger?: ILogger,\n onCompleteHandlers?: {\n put?: VoidFunction;\n patch?: VoidFunction;\n delete?: VoidFunction;\n },\n) => {\n const listeners = new Map<EventName, ProcessStreamResponse>();\n listeners.set('put', createPutListener(dataSourceUpdates, logger, onCompleteHandlers?.put));\n listeners.set('patch', createPatchListener(dataSourceUpdates, logger, onCompleteHandlers?.patch));\n return listeners;\n};\n","export * from './createStreamListeners';\nexport * from './DataSourceUpdates';","export enum DataSyncModeEnum {\n POLLING = 'polling',\n STREAMING = 'streaming'\n}","import { IDataSynchronizer } from \"./IDataSynchronizer\";\n\nexport class NullDataSynchronizer implements IDataSynchronizer {\n close(): void {\n }\n\n start(): void {\n }\n\n stop(): void {\n }\n\n identify(): void {\n }\n}","import { isHttpRecoverable, PollingError } from \"../errors\";\nimport { IDataSynchronizer } from \"./IDataSynchronizer\";\nimport { ILogger } from \"../logging/ILogger\";\nimport Configuration from \"../Configuration\";\nimport { EventName, PollingErrorHandler, ProcessStreamResponse, StreamResponseEventType } from \"./types\";\nimport Requestor from \"./Requestor\";\nimport { httpErrorMessage } from \"../utils/http\";\nimport { IUser } from \"../options/IUser\";\n\nexport default class PollingDataSynchronizer implements IDataSynchronizer {\n private stopped = false;\n\n private logger?: ILogger;\n\n private pollingInterval: number;\n\n private user: IUser | undefined;\n\n private timeoutHandle: any;\n\n constructor(\n config: Configuration,\n private readonly requestor: Requestor,\n private readonly getStoreTimestamp: () => number,\n private readonly listeners: Map<EventName, ProcessStreamResponse>,\n private readonly errorHandler?: PollingErrorHandler,\n ) {\n this.logger = config.logger;\n this.pollingInterval = config.pollingInterval;\n this.user = config.user;\n }\n\n private poll() {\n if (this.stopped) {\n return;\n }\n\n const startTime = Date.now();\n this.logger?.debug('Polling for feature flag and segments updates');\n this.requestor.requestData(this.getStoreTimestamp(), this.user, (err, body) => {\n const elapsed = Date.now() - startTime;\n const sleepFor = Math.max(this.pollingInterval - elapsed, 0);\n\n this.logger?.debug('Elapsed: %d ms, sleeping for %d ms', elapsed, sleepFor);\n if (err) {\n const {status} = err;\n if (status && !isHttpRecoverable(status)) {\n const message = httpErrorMessage(err, 'polling request');\n this.logger?.error(message);\n this.errorHandler?.(new PollingError(message, status));\n // It is not recoverable, return and do not trigger another\n // poll.\n return;\n }\n this.logger?.warn(httpErrorMessage(err, 'polling request', 'will retry'));\n } else {\n let featureFlags = [];\n let userKeyId = this.user?.keyId!;\n let processStreamResponse: ProcessStreamResponse | undefined = this.listeners.get('patch');\n\n if (body) {\n const message = JSON.parse(body);\n if (message.messageType === 'data-sync') {\n switch (message.data.eventType) {\n case StreamResponseEventType.patch:\n processStreamResponse = this.listeners.get('patch');\n break;\n case StreamResponseEventType.full:\n processStreamResponse = this.listeners.get('put');\n break;\n }\n\n ({featureFlags, userKeyId} = message.data);\n }\n }\n\n const data = processStreamResponse?.deserializeData?.(featureFlags);\n processStreamResponse?.processJson?.(userKeyId, data);\n }\n\n // Falling through, there was some type of error and we need to trigger\n // a new poll.\n this.timeoutHandle = setTimeout(() => {\n this.poll();\n }, sleepFor);\n });\n }\n\n identify(user: IUser) {\n this.user = {...user};\n }\n\n close(): void {\n this.stop();\n }\n\n start(): void {\n this.poll();\n }\n\n stop(): void {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n this.timeoutHandle = undefined;\n }\n this.stopped = true;\n }\n}\n\n\n\n","import { IRequestor } from \"./IRequestor\";\nimport Configuration from \"../Configuration\";\nimport { IInfo } from \"../platform/IInfo\";\nimport { IRequestOptions, IRequests, IResponse } from \"../platform/requests\";\nimport { StreamingError } from \"../errors\";\nimport { defaultHeaders } from \"../utils/http\";\n\n/**\n * @internal\n */\nexport default class Requestor implements IRequestor {\n private readonly headers: Record<string, string>;\n\n private readonly uri: string;\n\n constructor(\n sdkKey: string,\n config: Configuration,\n info: IInfo,\n private readonly requests: IRequests,\n ) {\n this.headers = defaultHeaders(sdkKey, info);\n this.uri = config.pollingUri;\n }\n\n /**\n * Perform a request and utilize the ETag cache. The ETags are cached in the\n * requestor instance.\n */\n private async request(\n requestUrl: string,\n options: IRequestOptions,\n ): Promise<{\n res: IResponse;\n body: string;\n }> {\n const res = await this.requests.fetch(requestUrl, options);\n\n const body = await res.text();\n\n return {res, body};\n }\n\n async requestData(timestamp: number, payload: any, cb: (err: any, body: any) => void) {\n const options: IRequestOptions = {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(payload)\n };\n try {\n const {res, body} = await this.request(`${ this.uri }?timestamp=${ timestamp ?? 0 }`, options);\n if (res.status !== 200 && res.status !== 304) {\n const err = new StreamingError(`Unexpected status code: ${ res.status }`, res.status);\n return cb(err, undefined);\n }\n return cb(undefined, res.status === 304 ? null : body);\n } catch (err) {\n return cb(err, undefined);\n }\n }\n}\n","import { IDataSynchronizer } from \"./IDataSynchronizer\";\nimport ClientContext from \"../options/ClientContext\";\nimport { EventName, ProcessStreamResponse } from \"./types\";\nimport { ILogger } from \"../logging/ILogger\";\nimport { IWebSocketWithEvents } from \"../platform/IWebSocket\";\nimport { IUser } from \"../options/IUser\";\n\nclass WebSocketDataSynchronizer implements IDataSynchronizer {\n private socket?: IWebSocketWithEvents;\n private readonly logger?: ILogger;\n\n private connectionAttemptStartTime?: number;\n\n constructor(\n sdkKey: string,\n user: IUser,\n clientContext: ClientContext,\n socket: IWebSocketWithEvents,\n private readonly getStoreTimestamp: () => number,\n private readonly listeners: Map<EventName, ProcessStreamResponse>,\n webSocketPingInterval: number\n ) {\n const {logger, streamingUri} = clientContext;\n\n this.logger = logger;\n this.socket = socket;\n this.socket.config({\n sdkKey,\n streamingUri,\n pingInterval: webSocketPingInterval,\n user,\n logger,\n getStoreTimestamp\n });\n\n this.listeners.forEach(({deserializeData, processJson}, eventName) => {\n this.socket?.addListener(eventName, (event) => {\n this.logger?.debug(`Received ${ eventName } event`);\n\n if (event?.data) {\n const {featureFlags, userKeyId} = event.data;\n const data = deserializeData(featureFlags);\n processJson(userKeyId, data);\n }\n });\n })\n }\n\n identify(user: IUser): void {\n this.socket?.identify(user);\n }\n\n start(): void {\n this.logConnectionStarted();\n\n this.socket?.connect();\n }\n\n private logConnectionStarted() {\n this.connectionAttemptStartTime = Date.now();\n this.logger?.info(`Stream connection attempt StartTime ${ this.connectionAttemptStartTime }`);\n }\n\n close(): void {\n this.stop();\n }\n\n stop(): void {\n this.socket?.close();\n this.socket = undefined;\n }\n}\n\nexport default WebSocketDataSynchronizer;","export * from './DataSyncMode';\nexport * from './IDataSynchronizer';\nexport * from './IRequestor';\nexport * from './NullDataSynchronizer';\nexport * from './PollingDataSynchronizer';\nexport * from './Requestor';\nexport * from './types';\nexport * from './utils';\nexport * from './WebSocketDataSynchronizer';","import { PollingError } from \"../errors\";\nimport { IFlag } from \"../evaluation/data/IFlag\";\n\nexport type PollingErrorHandler = (err: PollingError) => void;\n\nexport enum StreamResponseEventType {\n full = 'full',\n patch = 'patch'\n}\n\nexport interface IStreamResponse {\n eventType: StreamResponseEventType,\n featureFlags: IFlag[]\n}\n\nexport type EventName = 'delete' | 'patch' | 'ping' | 'put';\nexport type ProcessStreamResponse = {\n deserializeData: (flags: IFlag[]) => any;\n processJson: (userKeyId: string, json: any) => void;\n};","/********************** encode text begin *****************************/\nconst alphabet: Record<string, string> = {\n \"0\": \"Q\",\n \"1\": \"B\",\n \"2\": \"W\",\n \"3\": \"S\",\n \"4\": \"P\",\n \"5\": \"H\",\n \"6\": \"D\",\n \"7\": \"X\",\n \"8\": \"Z\",\n \"9\": \"U\",\n}\n\nfunction encodeNumber(param: number, length: number): string {\n var s = \"000000000000\" + param;\n const numberWithLeadingZeros = s.slice(s.length - length);\n return numberWithLeadingZeros.split('').map(n => alphabet[n]).join('');\n}\n\n// generate connection token\nexport function generateConnectionToken(text: string): string {\n text = text.replace(/=*$/, '');\n const timestamp = Date.now();\n const timestampCode = encodeNumber(timestamp, timestamp.toString().length);\n // get random number less than the length of the text as the start point, and it must be greater or equal to 2\n const start = Math.max(Math.floor(Math.random() * text.length), 2);\n\n return `${ encodeNumber(start, 3) }${ encodeNumber(timestampCode.length, 2) }${ text.slice(0, start) }${ timestampCode }${ text.slice(start) }`;\n}\n\n/********************** encode text end *****************************/","export class PollingError extends Error {\n public readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.status = status;\n this.name = 'FbPollingError';\n }\n}\n\nexport class StreamingError extends Error {\n public readonly code?: number;\n\n constructor(message: string, code?: number) {\n super(message);\n this.code = code;\n this.name = 'FbStreamingError';\n }\n}\n\nexport class UnexpectedResponseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FbUnexpectedResponseError';\n }\n}\n\n\nexport class ClientError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FbClientError';\n }\n}\n\nexport function isHttpRecoverable(status: number) {\n if (status >= 400 && status < 500) {\n return status === 400 || status === 408 || status === 429;\n }\n return true;\n}","import { ReasonKinds } from \"./ReasonKinds\";\nimport { IFlag } from \"./data/IFlag\";\nimport { EvalEvent } from \"../events/event\";\nimport { IUser } from \"../options/IUser\";\n\n/**\n * A class which encapsulates the result of an evaluation. It allows for differentiating between\n * successful and error result types.\n *\n * @internal\n */\nexport default class EvalResult {\n protected constructor(\n public kind: ReasonKinds,\n public value: IFlag | null,\n public reason?: string,\n ) {\n }\n\n static flagNotFound(flagKey: string) {\n return new EvalResult(ReasonKinds.FlagNotFound, null, `flag not found: ${ flagKey }`);\n }\n\n static matched(val: IFlag) {\n return new EvalResult(ReasonKinds.Match, val, 'target match');\n }\n\n toEvalEvent(user: IUser): EvalEvent | null {\n if (this.kind !== ReasonKinds.Match) {\n return null;\n }\n\n const targetedVariation = this.value?.variations.find(v => v.value === this.value?.variation);\n return new EvalEvent(user, this.value?.id!, targetedVariation!, this.value?.sendToExperiment!);\n }\n}","import { IFlag } from \"./data/IFlag\";\nimport EvalResult from \"./EvalResult\";\nimport { IStore } from \"../platform/IStore\";\nimport DataKinds from \"../store/DataKinds\";\n\n/**\n * @internal\n */\nexport default class Evaluator {\n constructor(private store: IStore) {\n }\n\n /**\n * Evaluate the given flag against the given context.\n * @param flagKey The key of the feature flag.\n */\n evaluate(\n flagKey: string,\n ): EvalResult {\n const flag = this.store.get(DataKinds.Flags, flagKey) as unknown as IFlag;\n if (!flag) {\n return EvalResult.flagNotFound(flagKey);\n }\n\n return EvalResult.matched(flag);\n }\n}","/**\n * Different kinds of error which may be encountered during evaluation.\n */\nexport enum ReasonKinds {\n ClientNotReady = 'ClientNotReady',\n Match = 'Match',\n WrongType = 'WrongType',\n FlagNotFound = 'FlagNotFound',\n Error = 'Error'\n}","export type FlagValue = any;\n\nexport enum VariationDataType {\n string = 'string',\n boolean = 'boolean',\n number = 'number',\n json = 'json',\n empty = ''\n}\n\nexport interface IVariation {\n id: number,\n value: FlagValue\n}\n\nexport interface IFlagBase {\n id: string, // the key\n variation: FlagValue,\n variationType: VariationDataType,\n sendToExperiment?: boolean,\n timestamp?: number,\n variationOptions?: IVariation[],\n}\n\nexport interface IFlag extends IFlagBase {\n key: string, // the same value to id\n variations: IVariation[],// the same value to variationOptions\n version: number\n}\n","export * from './IFlag';","export * from './data';\nexport * from './EvalResult';\nexport * from './Evaluator';\nexport * from './IEvalDetail';\nexport * from './ReasonKinds';","import { IEventProcessor } from \"./IEventProcessor\";\nimport { EventDispatcher } from \"./EventDispatcher\";\nimport ClientContext from \"../options/ClientContext\";\nimport { FlushEvent, IEvent, ShutdownEvent } from \"./event\";\nimport { isNullOrUndefined } from \"../utils/isNullOrUndefined\";\nimport { IEventQueue } from \"./IEventQueue\";\nimport { DefaultEventQueue } from \"./DefaultEventQueue\";\nimport { ILogger } from \"../logging/ILogger\";\n\nexport class DefaultEventProcessor implements IEventProcessor {\n private readonly logger: ILogger;\n private readonly flushInterval: number;\n private readonly eventDispatcher: EventDispatcher;\n private readonly eventQueue: IEventQueue;\n private closed: boolean = false;\n\n constructor(clientContext: ClientContext) {\n const {logger, flushInterval, maxEventsInQueue} = clientContext;\n this.logger = logger!;\n this.flushInterval = flushInterval;\n this.eventQueue = new DefaultEventQueue(maxEventsInQueue, this.logger);\n this.eventDispatcher = new EventDispatcher(clientContext, this.eventQueue);\n\n this.flushLoop();\n }\n\n private flushLoop() {\n if (this.closed) {\n return;\n }\n\n setTimeout(async () => {\n try {\n await this.flush();\n } catch (err) {\n this.logger.error('Unexpected error while flushing events in event processor.', err);\n }\n\n this.flushLoop();\n }, this.flushInterval);\n }\n\n flush(): Promise<any> {\n const flushEvent = new FlushEvent();\n this.record(flushEvent);\n return flushEvent.waitForCompletion();\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n // send a shutdown event to dispatcher\n const shutdown = new ShutdownEvent();\n this.record(shutdown);\n\n try {\n await shutdown.waitForCompletion();\n } catch (err) {\n this.logger.error('Event processor shutdown but not complete.');\n }\n\n // mark the event queue as complete for adding\n this.eventQueue.close();\n this.closed = true;\n }\n\n record(event: IEvent | null): boolean {\n if (isNullOrUndefined(event)) {\n return false;\n }\n\n if (!this.eventQueue.addEvent(event!)) {\n if (event instanceof FlushEvent) {\n event.complete();\n }\n\n return false;\n }\n\n return true;\n }\n}","import { IEventQueue } from \"./IEventQueue\";\nimport { IEvent } from \"./event\";\nimport { ILogger } from \"../logging/ILogger\";\n\nexport class DefaultEventQueue implements IEventQueue {\n private events: IEvent[];\n private closed: boolean = false;\n\n constructor(private readonly capacity: number, private readonly logger: ILogger) {\n this.events = [];\n }\n\n addEvent(event: IEvent): boolean {\n if (this.closed) {\n return false;\n }\n\n if (this.events.length >= this.capacity) {\n this.logger.warn(\"Events are being produced faster than they can be processed. We shouldn't see this.\");\n return false;\n }\n\n this.events.push(event);\n return true;\n }\n\n clear(): void {\n this.events = [];\n }\n\n shift(): IEvent | undefined {\n return this.events.shift();\n }\n\n close(): void {\n this.closed = true;\n }\n\n get eventsSnapshot(): IEvent[] {\n return [...this.events];\n }\n\n get length(): number {\n return this.events.length;\n }\n\n get isEmpty(): boolean {\n return this.length === 0;\n }\n}","import { DeliveryStatus, IEventSender, IEventSenderResult } from \"./IEventSender\";\nimport ClientContext from \"../options/ClientContext\";\nimport { defaultHeaders, httpErrorMessage } from \"../utils/http\";\nimport { IRequests } from \"../platform/requests\";\nimport { isHttpRecoverable, UnexpectedResponseError } from \"../errors\";\nimport sleep from \"../utils/sleep\";\n\nexport class DefaultEventSender implements IEventSender {\n private readonly defaultHeaders: {\n [key: string]: string;\n };\n private readonly eventsUri: string;\n private requests: IRequests;\n\n constructor(clientContext: ClientContext) {\n const {\n sdkKey,\n eventsUri,\n platform\n } = clientContext;\n\n const {info, requests} = platform;\n this.defaultHeaders = defaultHeaders(sdkKey, info);\n this.eventsUri = eventsUri;\n this.requests = requests;\n }\n\n async send(payload: string, retry: boolean): Promise<IEventSenderResult> {\n const res: IEventSenderResult = {\n status: DeliveryStatus.Succeeded,\n };\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n 'content-type': 'application/json',\n }\n\n let error;\n try {\n const {status} = await this.requests.fetch(this.eventsUri, {\n headers,\n body: payload,\n method: 'POST',\n });\n\n if (status >= 200 && status <= 299) {\n return res;\n }\n\n error = new UnexpectedResponseError(\n httpErrorMessage({status, message: 'some events were dropped'}, 'event posting'),\n );\n\n if (!isHttpRecoverable(status)) {\n res.status = DeliveryStatus.FailedAndMustShutDown;\n res.error = error;\n return res;\n }\n } catch (err) {\n error = err;\n }\n\n // recoverable but not retrying\n if (error && !retry) {\n res.status = DeliveryStatus.Failed;\n res.error = error;\n return res;\n }\n\n // wait 1 second before retrying\n await sleep();\n\n return this.send(payload, false);\n }\n}","import { IEventSerializer } from \"./EventSerializer\";\nimport { EvalEvent, IEvent, MetricEvent } from \"./event\";\n\nexport class DefaultEventSerializer implements IEventSerializer {\n serialize(events: IEvent[]): string {\n const payload = events\n .map(event => event instanceof EvalEvent || event instanceof MetricEvent ? event.toPayload() : null)\n .filter(event => event !== null);\n\n return JSON.stringify(payload);\n }\n}","import { ILogger } from \"../logging/ILogger\";\nimport ClientContext from \"../options/ClientContext\";\nimport { DeliveryStatus, IEventSender } from \"./IEventSender\";\nimport { IEventQueue } from \"./IEventQueue\";\nimport { DefaultEventQueue } from \"./DefaultEventQueue\";\nimport { DefaultEventSender } from \"./DefaultEventSender\";\nimport { AsyncEvent, FlushEvent, IEvent, PayloadEvent, ShutdownEvent } from \"./event\";\nimport { IEventSerializer } from \"./EventSerializer\";\nimport { DefaultEventSerializer } from \"./DefaultEventSerializer\";\nimport sleep from \"../utils/sleep\";\n\nexport class EventDispatcher {\n private readonly logger: ILogger;\n private sender: IEventSender;\n private buffer: IEventQueue;\n private serializer: IEventSerializer;\n\n private maxEventPerRequest = 50;\n private stopped: boolean = false;\n\n constructor(clientContext: ClientContext, queue: IEventQueue) {\n const {logger, maxEventsInQueue} = clientContext;\n this.logger = logger!;\n\n this.buffer = new DefaultEventQueue(maxEventsInQueue, this.logger);\n this.sender = new DefaultEventSender(clientContext);\n this.serializer = new DefaultEventSerializer();\n\n this.dispatchLoop(queue).then();\n }\n\n private async dispatchLoop(queue: IEventQueue) {\n this.logger.debug('Start dispatch loop.');\n\n let running = true;\n while (running) {\n try {\n const event = queue.shift();\n\n if (event === undefined) {\n await sleep(1000);\n continue;\n }\n\n if (event instanceof PayloadEvent) {\n this.addEventToBuffer(event);\n } else if (event instanceof FlushEvent) {\n await this.triggerFlush(event);\n } else if (event instanceof ShutdownEvent) {\n await this.triggerFlush(event);\n this.stopped = true;\n running = false;\n }\n } catch (err) {\n this.logger.error('Unexpected error in event dispatcher.', err);\n }\n }\n\n this.logger.debug('Finish dispatch loop.');\n }\n\n private addEventToBuffer(event: IEvent) {\n if (this.stopped) {\n return;\n }\n\n if (this.buffer.addEvent(event)) {\n this.logger.debug('Added event to buffer.');\n } else {\n this.logger.warn('Exceeded event queue capacity, event will be dropped. Increase capacity to avoid dropping events.');\n }\n }\n\n private async triggerFlush(event: AsyncEvent) {\n if (this.stopped) {\n event.complete();\n return;\n }\n\n if (this.buffer.isEmpty) {\n event.complete();\n this.logger.debug('Flush empty buffer.');\n // There are no events to flush. If we don't complete the message, then the async task may never\n // complete (if it had a non-zero positive timeout, then it would complete after the timeout).\n return;\n }\n\n const snapshot = this.buffer.eventsSnapshot;\n this.buffer.clear();\n try {\n await this.flushEvents(snapshot);\n this.logger.debug(`${ snapshot.length } events has been flushed.`);\n } catch (err) {\n this.logger.warn('Exception happened when flushing events', err);\n }\n\n event.complete();\n }\n\n private async flushEvents(events: IEvent[]) {\n events = this.getUniqueEvents(events);\n const total = events.length;\n for (let i = 0; i < total; i += this.maxEventPerRequest) {\n const length = Math.min(this.maxEventPerRequest, total - i);\n const slice = events.slice(i, i + length);\n const payload = this.serializer.serialize(slice);\n\n const {status} = await this.sender.send(payload, true);\n if (status === DeliveryStatus.FailedAndMustShutDown) {\n this.stopped = true;\n }\n }\n }\n\n private getUniqueEvents(events: IEvent[]): IEvent[] {\n const uniqueEvents: IEvent[] = [];\n const hashes: string[] = [];\n\n for (const event of events) {\n if (!hashes.includes(event.hash)) {\n uniqueEvents.push(event);\n hashes.push(event.hash);\n }\n }\n\n return uniqueEvents;\n }\n}","export enum DeliveryStatus {\n Succeeded,\n Failed,\n FailedAndMustShutDown\n}\n\nexport interface IEventSenderResult {\n status: DeliveryStatus,\n error?: any\n}\n\nexport interface IEventSender {\n send(payload: string, retry: boolean): Promise<IEventSenderResult>;\n}","import { IEventProcessor } from \"./IEventProcessor\";\nimport { IEvent } from \"./event\";\n\nexport class NullEventProcessor implements IEventProcessor {\n flush(): Promise<void> {\n return Promise.resolve();\n }\n\n close(): Promise<void> {\n return Promise.resolve();\n }\n\n record(event: IEvent | null): boolean {\n return false;\n }\n}","import { IUser } from \"../options/IUser\";\nimport { IVariation } from \"../evaluation/data/IFlag\";\n\nexport interface IEvent {\n hash: string;\n}\n\nexport class AsyncEvent implements IEvent {\n private readonly isCompletedPromise?: Promise<AsyncEvent>;\n private resolveFn?: (value: AsyncEvent) => void;\n timestamp = (new Date()).getTime();\n\n get hash(): string {\n return this.timestamp.toString();\n }\n\n constructor() {\n this.isCompletedPromise = new Promise<AsyncEvent>((resolve) => {\n this.resolveFn = resolve;\n });\n }\n\n waitForCompletion(): Promise<AsyncEvent> {\n return this.isCompletedPromise!;\n }\n\n complete() {\n this.resolveFn?.(this);\n }\n}\n\nexport class FlushEvent extends AsyncEvent {\n}\n\nexport class ShutdownEvent extends AsyncEvent {\n}\n\nexport class PayloadEvent implements IEvent {\n timestamp = (new Date()).getTime();\n\n get hash(): string {\n return this.timestamp.toString();\n }\n\n toPayload(): any {\n };\n}\n\nexport class MetricEvent extends PayloadEvent {\n constructor(\n public user: IUser,\n public eventName: string,\n public appType: string,\n public metricValue: number\n ) {\n super();\n }\n\n private userPayload() {\n return {\n keyId: this.user.keyId,\n name: this.user.name,\n customizedProperties: this.user.customizedProperties\n }\n }\n\n toPayload(): any {\n return {\n user: this.userPayload(),\n metrics: [{\n route: 'index/metric',\n timestamp: this.timestamp,\n numericValue: this.metricValue,\n appType: this.appType,\n eventName: this.eventName,\n type: 'CustomEvent'\n }]\n }\n }\n\n get hash(): string {\n const payload = this.toPayload();\n const hasObject = {\n user: payload.user,\n metrics: payload.metrics.map((m: any) => ({...m, timestamp: undefined}))\n }\n return JSON.stringify(hasObject);\n }\n}\n\nexport class EvalEvent extends PayloadEvent {\n constructor(\n public user: IUser,\n public flagKey: string,\n public variation: IVariation,\n public sendToExperiment: boolean\n ) {\n super();\n }\n\n private userPayload() {\n return {\n keyId: this.user.keyId,\n name: this.user.name,\n customizedProperties: this.user.customizedProperties\n }\n }\n\n toPayload(): any {\n return {\n user: this.userPayload(),\n variations: [{\n featureFlagKey: this.flagKey,\n sendToExperiment: this.sendToExperiment,\n timestamp: this.timestamp,\n variation: this.variation\n }]\n }\n }\n\n get hash(): string {\n const payload = this.toPayload();\n const hasObject = {\n user: payload.user,\n variations: payload.variations.map((m: any) => ({...m, timestamp: undefined}))\n }\n\n return JSON.stringify(hasObject);\n }\n}","export * from './DefaultEventProcessor';\nexport * from './DefaultEventQueue';\nexport * from './DefaultEventSender';\nexport * from './DefaultEventSerializer';\nexport * from './event';\nexport * from './EventDispatcher';\nexport * from './EventSerializer';\nexport * from './IEventProcessor';\nexport * from './IEventQueue';\nexport * from './IEventSender';\nexport * from './NullEventProcessor';\n","export * from './bootstrap';\nexport * from './data-sources';\nexport * from './evaluation';\nexport * from './events';\nexport * from './logging';\nexport * from './options';\nexport * from './platform';\nexport * from './store';\nexport * from './data-sync';\nexport * from './utils';\n\nexport * from './Configuration';\nexport * from './constants';\nexport * from './Context';\nexport * from './errors';\nexport * from './FbClientBuilder';\nexport * from './IContextProperty';\nexport * from './IDataKind';\nexport * from './IFbClient';\nexport * from './IVersionedData';\nexport * from './FbClientCore';\n\n","import format from './format';\nimport { ILogger } from \"./ILogger\";\nimport { IBasicLoggerOptions } from \"./IBasicLoggerOptions\";\n\nconst LogPriority = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst LevelNames = ['debug', 'info', 'warn', 'error', 'none'];\n\n/**\n * A basic logger which handles filtering by level.\n *\n * With the default options it will write to `console.error`\n * and it will use the formatting provided by `console.error`.\n * If the destination is overwritten, then it will use an included\n * formatter similar to `util.format`.\n *\n * If a formatter is available, then that should be overridden\n * as well for performance.\n */\nexport class BasicLogger implements ILogger {\n private logLevel: number;\n\n private name: string;\n\n private destination?: (line: string) => void;\n\n private formatter?: (...args: any[]) => string;\n\n /**\n * This should only be used as a default fallback and not as a convenient\n * solution. In most cases you should construct a new instance with the\n * appropriate options for your specific needs.\n */\n static get() {\n return new BasicLogger({});\n }\n\n constructor(options: IBasicLoggerOptions) {\n this.logLevel = LogPriority[options.level ?? 'info'] ?? LogPriority.info;\n this.name = options.name ?? 'FeatBit';\n // eslint-disable-next-line no-console\n this.destination = options.destination;\n this.formatter = options.formatter;\n }\n\n private tryFormat(...args: any[]): string {\n try {\n if (this.formatter) {\n // In case the provided formatter fails.\n return this.formatter?.(...args);\n }\n return format(...args);\n } catch {\n return format(...args);\n }\n }\n\n private tryWrite(msg: string) {\n try {\n this.destination!(msg);\n } catch {\n // eslint-disable-next-line no-console\n console.error(msg);\n }\n }\n\n private log(level: number, args: any[]) {\n if (level >= this.logLevel) {\n const prefix = `${ LevelNames[level] }: [${ this.name }]`;\n try {\n if (this.destination) {\n this.tryWrite(`${ prefix } ${ this.tryFormat(...args) }`);\n } else {\n // `console.error` has its own formatter.\n // So we don't need to do anything.\n // eslint-disable-next-line no-console\n console.error(...args);\n }\n } catch {\n // If all else fails do not break.\n // eslint-disable-next-line no-console\n console.error(...args);\n }\n }\n }\n\n error(...args: any[]): void {\n this.log(LogPriority.error, args);\n }\n\n warn(...args: any[]): void {\n this.log(LogPriority.warn, args);\n }\n\n info(...args: any[]): void {\n this.log(LogPriority.info, args);\n }\n\n debug(...args: any[]): void {\n this.log(LogPriority.debug, args);\n }\n}\n","import { ILogger } from \"./ILogger\";\nimport { TypeValidators } from \"../options/Validators\";\n\nconst loggerRequirements = {\n error: TypeValidators.Function,\n warn: TypeValidators.Function,\n info: TypeValidators.Function,\n debug: TypeValidators.Function,\n};\n\n/**\n * The safeLogger logic exists because we allow the application to pass in a custom logger, but\n * there is no guarantee that the logger works correctly and if it ever throws exceptions there\n * could be serious consequences (e.g. an uncaught exception within an error event handler, due\n * to the SDK trying to log the error, can terminate the application). An exception could result\n * from faulty logic in the logger implementation, or it could be that this is not a logger at\n * all but some other kind of object; the former is handled by a catch block that logs an error\n * message to the SDK's default logger, and we can at least partly guard against the latter by\n * checking for the presence of required methods at configuration time.\n */\nexport class SafeLogger implements ILogger {\n private logger: ILogger;\n\n private fallback: ILogger;\n\n /**\n * Construct a safe logger with the specified logger.\n * @param logger The logger to use.\n * @param fallback A fallback logger to use in case an issue is encountered using\n * the provided logger.\n */\n constructor(logger: ILogger, fallback: ILogger) {\n Object.entries(loggerRequirements).forEach(([level, validator]) => {\n if (!validator.is((logger as any)[level])) {\n throw new Error(`Provided logger instance must support logger.${ level }(...) method`);\n // Note that the SDK normally does not throw exceptions to the application, but that rule\n // does not apply to FbClientNode.init() which will throw an exception if the parameters are so\n // invalid that we cannot proceed with creating the client. An invalid logger meets those\n // criteria since the SDK calls the logger during nearly all of its operations.\n }\n });\n this.logger = logger;\n this.fallback = fallback;\n }\n\n private log(level: 'error' | 'warn' | 'info' | 'debug', args: any[]) {\n try {\n this.logger[level](...args);\n } catch {\n // If all else fails do not break.\n this.fallback[level](...args);\n }\n }\n\n error(...args: any[]): void {\n this.log('error', args);\n }\n\n warn(...args: any[]): void {\n this.log('warn', args);\n }\n\n info(...args: any[]): void {\n this.log('info', args);\n }\n\n debug(...args: any[]): void {\n this.log('debug', args);\n }\n}","import { TypeValidators } from \"../options/Validators\";\n\n\n/**\n * Attempt to produce a string representation of a value.\n * The format should be roughly comparable to `util.format`\n * aside from object which will be JSON versus the `util.inspect`\n * format.\n * @param val\n * @returns A string representation of the value if possible.\n */\nfunction tryStringify(val: any) {\n if (typeof val === 'string') {\n return val;\n }\n if (val === undefined) {\n return 'undefined';\n }\n if (val === null) {\n return 'null';\n }\n if (Object.prototype.hasOwnProperty.call(val, 'toString')) {\n try {\n return val.toString();\n } catch {\n /* Keep going */\n }\n }\n\n if (typeof val === 'bigint') {\n return `${ val }n`;\n }\n try {\n return JSON.stringify(val);\n } catch (error) {\n if (error instanceof TypeError && error.message.indexOf('circular') >= 0) {\n return '[Circular]';\n }\n return '[Not Stringifiable]';\n }\n}\n\n/**\n * Attempt to produce a numeric representation.\n * BigInts have an `n` suffix.\n * @param val\n * @returns The numeric representation or 'NaN' if not numeric.\n */\nfunction toNumber(val: any): string {\n // Symbol has to be treated special because it will\n // throw an exception if an attempt is made to convert it.\n if (typeof val === 'symbol') {\n return 'NaN';\n }\n if (typeof val === 'bigint') {\n return `${ val }n`;\n }\n return String(Number(val));\n}\n\n/**\n * Attempt to produce an integer representation.\n * BigInts have an `n` suffix.\n * @param val\n * @returns The integer representation or 'NaN' if not numeric.\n */\nfunction toInt(val: any): string {\n if (typeof val === 'symbol') {\n return 'NaN';\n }\n if (typeof val === 'bigint') {\n return `${ val }n`;\n }\n return String(parseInt(val, 10));\n}\n\n/**\n * Attempt to produce a float representation.\n * BigInts have an `n` suffix.\n * @param val\n * @returns The integer representation or 'NaN' if not numeric.\n */\nfunction toFloat(val: any): string {\n if (typeof val === 'symbol') {\n return 'NaN';\n }\n return String(parseFloat(val));\n}\n\n// Based on:\n// https://nodejs.org/api/util.html#utilformatformat-args\n// The result will not match browser exactly, but it should get the\n// right information through.\nconst escapes: Record<string, (val: any) => string> = {\n s: (val: any) => tryStringify(val),\n d: (val: any) => toNumber(val),\n i: (val: any) => toInt(val),\n f: (val: any) => toFloat(val),\n j: (val: any) => tryStringify(val),\n o: (val: any) => tryStringify(val),\n O: (val: any) => tryStringify(val),\n c: () => '',\n};\n\n/**\n * A basic formatted for use where `util.format` is not available.\n * This will not be as performant, but it will produce formatted\n * messages.\n *\n * @internal\n *\n * @param args\n * @returns Formatted string.\n */\nexport default function format(...args: any[]): string {\n const formatString = args.shift();\n if (TypeValidators.String.is(formatString)) {\n let out = '';\n let i = 0;\n while (i < formatString.length) {\n const char = formatString.charAt(i);\n if (char === '%') {\n const nextIndex = i + 1;\n if (nextIndex < formatString.length) {\n const nextChar = formatString.charAt(i + 1);\n if (nextChar in escapes && args.length) {\n const value = args.shift();\n // This rule is for math.\n // eslint-disable-next-line no-unsafe-optional-chaining\n out += escapes[nextChar]?.(value);\n } else if (nextChar === '%') {\n out += '%';\n } else {\n out += `%${ nextChar }`;\n }\n i += 2;\n }\n } else {\n out += char;\n i += 1;\n }\n }\n // If there are any args left after we exhaust the format string\n // then just stick those on the end.\n if (args.length) {\n if (out.length) {\n out += ' ';\n }\n out += args.map(tryStringify).join(' ');\n }\n return out;\n }\n return args.map(tryStringify).join(' ');\n}\n","export * from './BasicLogger';\nexport * from './format';\nexport * from './IBasicLoggerOptions';\nexport * from './ILogger';\nexport * from './LogLevel';\nexport * from './SafeLogger';","import { ILogger } from \"../logging/ILogger\";\nimport { IPlatform } from \"../platform/IPlatform\";\nimport { IClientContext } from \"./IClientContext\";\nimport { IUser } from \"./IUser\";\n\n/**\n * The client context provides basic configuration and platform support which are required\n * when building SDK components.\n */\nexport default class ClientContext implements IClientContext {\n flushInterval: number;\n maxEventsInQueue: number;\n offline: boolean;\n logger: ILogger;\n eventsUri: string;\n pollingUri: string;\n streamingUri: string;\n\n constructor(\n public readonly sdkKey: string,\n configuration: {\n logger?: ILogger;\n offline?: boolean;\n flushInterval: number;\n maxEventsInQueue: number;\n streamingUri: string;\n pollingUri: string;\n eventsUri: string;\n },\n public readonly platform: IPlatform,\n ) {\n this.logger = configuration.logger!;\n this.offline = configuration.offline!;\n this.flushInterval = configuration.flushInterval;\n this.maxEventsInQueue = configuration.maxEventsInQueue;\n this.streamingUri = configuration.streamingUri;\n this.pollingUri = configuration.pollingUri;\n this.eventsUri = configuration.eventsUri;\n }\n}","/**\n * Messages for issues which can be encountered from processing the configuration options.\n */\nexport default class OptionMessages {\n static optionBelowMinimum(name: string, value: number, min: number): string {\n return `Config option \"${ name }\" had invalid value of ${ value }, using minimum of ${ min } instead`;\n }\n\n static unknownOption(name: string): string {\n return `Ignoring unknown config option \"${ name }\"`;\n }\n\n static wrongOptionType(name: string, expectedType: string, actualType: string): string {\n return `Config option \"${ name }\" should be of type ${ expectedType }, got ${ actualType }, using default value`;\n }\n\n static wrongOptionTypeBoolean(name: string, actualType: string): string {\n return `Config option \"${ name }\" should be a boolean, got ${ actualType }, converting to boolean`;\n }\n\n static partialEndpoint(name: string): string {\n return `You have set custom uris without specifying the ${ name } URI; connections may not work properly`;\n }\n\n static mandatory(name: string): string {\n return `${ name } is mandatory`;\n }\n\n static invalidOptionValue(name: string): string {\n return `Invalid option value: ${ name }`;\n }\n\n static missingKeyInBootstrapValue(key: string): string {\n return `Missing key \"${ key }\" in bootstrap value`;\n }\n}","import { IUser } from \"./IUser\";\nimport {IContextProperty} from \"../IContextProperty\";\n\n/**\n * Creates an instance of the FeatBit user.\n *\n * @return\n * The new {@link IUser} instance.\n */\nexport class UserBuilder {\n private _keyId: string = '';\n private _name: string = '';\n private _custom: IContextProperty[] = [];\n\n constructor(keyId: string) {\n this._keyId = keyId;\n }\n\n name(name: string): UserBuilder {\n this._name = name;\n return this;\n }\n\n custom(propertyName: string, value: string): UserBuilder {\n this._custom?.push({ name: propertyName, value: value });\n return this;\n }\n\n build(): IUser {\n return {\n name: this._name,\n keyId: this._keyId,\n customizedProperties: this._custom\n };\n }\n}","/* eslint-disable class-methods-use-this */\n/* eslint-disable max-classes-per-file */\n\n// The classes here are static, but needs to be instantiated to\n// support the generic functionality. Which is why we do not care about using\n// `this`\n\n// These validators are also of trivial complexity, so we are allowing more than\n// one per file.\n\nimport OptionMessages from \"./OptionMessages\";\nimport { IFlagBase } from \"../evaluation\";\n\n/**\n * Interface for type validation.\n */\nexport interface TypeValidator {\n // holding validation error messages\n messages?: string[];\n\n is(u: unknown): boolean;\n\n getType(): string;\n}\n\n/**\n * Validate a factory or instance.\n */\nexport class FactoryOrInstance implements TypeValidator {\n is(factoryOrInstance: unknown) {\n if (Array.isArray(factoryOrInstance)) {\n return false;\n }\n const anyFactory = factoryOrInstance as any;\n const typeOfFactory = typeof anyFactory;\n return typeOfFactory === 'function' || typeOfFactory === 'object';\n }\n\n getType(): string {\n return 'factory method or object';\n }\n}\n\n/**\n * Validate a basic type.\n */\nexport class Type<T> implements TypeValidator {\n private typeName: string;\n\n protected typeOf: string;\n\n constructor(typeName: string, example: T) {\n this.typeName = typeName;\n this.typeOf = typeof example;\n }\n\n is(u: unknown): u is T {\n if (Array.isArray(u)) {\n return false;\n }\n return typeof u === this.typeOf;\n }\n\n getType(): string {\n return this.typeName;\n }\n}\n\n/**\n * Validate an array of the specified type.\n *\n * This does not validate instances of types. All class instances\n * of classes will simply objects.\n */\nexport class TypeArray<T> implements TypeValidator {\n private typeName: string;\n\n protected typeOf: string;\n\n constructor(typeName: string, example: T) {\n this.typeName = typeName;\n this.typeOf = typeof example;\n }\n\n is(u: unknown): u is T {\n if (Array.isArray(u)) {\n if (u.length > 0) {\n return u.every((val) => typeof val === this.typeOf);\n }\n return true;\n }\n return false;\n }\n\n getType(): string {\n return this.typeName;\n }\n}\n\n/**\n * Validate a value is a number and is greater or eval than a minimum.\n */\nexport class NumberWithMinimum extends Type<number> {\n readonly min: number;\n\n constructor(min: number) {\n super(`number with minimum value of ${ min }`, 0);\n this.min = min;\n }\n\n override is(u: unknown): u is number {\n return typeof u === this.typeOf && (u as number) >= this.min;\n }\n}\n\n/**\n * Validate a value is a string and it matches the given expression.\n */\nexport class StringMatchingRegex extends Type<string> {\n readonly expression: RegExp;\n\n constructor(expression: RegExp) {\n super(`string matching ${ expression }`, '');\n this.expression = expression;\n }\n\n override is(u: unknown): u is string {\n return !!(u as string).match(this.expression);\n }\n}\n\n/**\n * Validate a value is a function.\n */\nexport class Function implements TypeValidator {\n is(u: unknown): u is (...args: any[]) => void {\n // We cannot inspect the parameters and there isn't really\n // a generic function type we can instantiate.\n // So the type guard is here just to make TS comfortable\n // calling something after using this guard.\n return typeof u === 'function';\n }\n\n getType(): string {\n return 'function';\n }\n}\n\nexport class NullableBoolean implements TypeValidator {\n is(u: unknown): boolean {\n return typeof u === 'boolean' || typeof u === 'undefined' || u === null;\n }\n\n getType(): string {\n return 'boolean | undefined | null';\n }\n}\n\nexport class BootstrapValidator implements TypeValidator {\n messages: string[] = [];\n\n is(u: unknown): boolean {\n if (typeof u !== 'object' || u === null) {\n this.messages.push(OptionMessages.invalidOptionValue('bootstrap'));\n return false;\n }\n\n try {\n const bootstrap = u as IFlagBase[];\n for (let flag of bootstrap) {\n const hasMandatoryKeys = ['id', 'variation'].every((key) => Object.keys(flag).includes(key));\n const keys = Object.keys(flag);\n\n if (keys.includes('id')) {\n this.messages.push(OptionMessages.missingKeyInBootstrapValue('id'));\n }\n\n if (keys.includes('variation')) {\n this.messages.push(OptionMessages.missingKeyInBootstrapValue('variation'));\n }\n\n if (this.messages.length > 0) {\n return false;\n }\n }\n } catch (_) {\n this.messages.push(OptionMessages.wrongOptionType('bootstrap', this.getType(), typeof u));\n return false;\n }\n\n return true;\n }\n\n getType(): string {\n return 'IFlagBase[]';\n }\n}\n\nexport class UserValidator implements TypeValidator {\n messages: string[] = [];\n\n is(u: unknown): boolean {\n if (typeof u !== 'object' || u === null) {\n this.messages.push(OptionMessages.mandatory('user'));\n return false;\n }\n\n const user = u as any;\n\n if (typeof user.keyId !== 'string' || user.keyId.trim() === '') {\n this.messages.push(OptionMessages.mandatory('user.keyId'));\n return false;\n }\n\n if (typeof user.name !== 'string' || user.name.trim() === '') {\n this.messages.push(OptionMessages.mandatory('user.name'));\n return false;\n }\n\n return true;\n }\n\n getType(): string {\n return 'user';\n }\n}\n\n// Our reference SDK, Go, parses date/time strings with the time.RFC3339Nano format.\n// This regex should match strings that are valid in that format, and no others.\n// Acceptable:\n// 2019-10-31T23:59:59Z, 2019-10-31T23:59:59.100Z,\n// 2019-10-31T23:59:59-07, 2019-10-31T23:59:59-07:00, etc.\n// Unacceptable: no \"T\", no time zone designation\nconst DATE_REGEX = /^\\d\\d\\d\\d-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(\\.\\d\\d*)?(Z|[-+]\\d\\d(:\\d\\d)?)/;\n\n/**\n * Validate a value is a date. Values which are numbers are treated as dates and any string\n * which if compliant with `time.RFC3339Nano` is a date.\n */\nexport class DateValidator implements TypeValidator {\n is(u: unknown): boolean {\n return typeof u === 'number' || (typeof u === 'string' && DATE_REGEX.test(u));\n }\n\n getType(): string {\n return 'date';\n }\n}\n\n/**\n * Validates that a string is a valid kind.\n */\nexport class KindValidator extends StringMatchingRegex {\n constructor() {\n super(/^(\\w|\\.|-)+$/);\n }\n\n override is(u: unknown): u is string {\n return super.is(u) && u !== 'kind';\n }\n}\n\n/**\n * A set of standard type validators.\n */\nexport class TypeValidators {\n static readonly String = new Type<string>('string', '');\n\n static readonly Number = new Type<number>('number', 0);\n\n static readonly ObjectOrFactory = new FactoryOrInstance();\n\n static readonly Object = new Type<object>('object', {});\n\n static readonly StringArray = new TypeArray<string>('string[]', '');\n\n static readonly Boolean = new Type<boolean>('boolean', true);\n\n static readonly User = new Type<object>('object', {});\n\n static readonly Bootstrap = new Type<object>('object', {});\n\n static readonly Function = new Function();\n\n static createTypeArray<T>(typeName: string, example: T) {\n return new TypeArray<T>(typeName, example);\n }\n\n static numberWithMin(min: number): NumberWithMinimum {\n return new NumberWithMinimum(min);\n }\n\n static stringMatchingRegex(expression: RegExp): StringMatchingRegex {\n return new StringMatchingRegex(expression);\n }\n\n static readonly Date = new DateValidator();\n\n static readonly Kind = new KindValidator();\n static readonly NullableBoolean = new NullableBoolean();\n}","export * from './ClientContext';\nexport * from './IClientContext';\nexport * from './IOptions';\nexport * from './IUser';\nexport * from './IValidatedOptions';\nexport * from './OptionMessages';\nexport * from './UserBuilder';\nexport * from './Validators';","import { IInfo, IPlatformData, ISdkData } from \"../IInfo\";\nimport { name, version } from '../../version';\n\n\nexport default class BrowserInfo implements IInfo {\n get appType(): string {\n return 'Browser-Client-SDK';\n }\n\n platformData(): IPlatformData {\n return {\n os: {},\n name: 'Browser',\n additional: {},\n };\n }\n\n sdkData(): ISdkData {\n return {\n name: name,\n version: version,\n userAgentBase: this.appType\n };\n }\n}","import { IPlatform } from \"../IPlatform\";\nimport { IInfo } from \"../IInfo\";\nimport { IRequests } from \"../requests\";\nimport { IOptions } from \"../../options/IOptions\";\nimport BrowserInfo from \"./BrowserInfo\";\nimport { BrowserRequests } from \"./BrowserRequests\";\nimport { IWebSocketWithEvents } from \"../IWebSocket\";\nimport BrowserWebSocket from \"./BrowserWebSocket\";\n\nexport default class BrowserPlatform implements IPlatform {\n info: IInfo = new BrowserInfo();\n\n requests: IRequests;\n webSocket: IWebSocketWithEvents;\n\n constructor(options: IOptions) {\n this.requests = new BrowserRequests();\n this.webSocket = new BrowserWebSocket();\n }\n}","import { IRequestOptions, IRequests } from \"../requests\";\n\nexport class BrowserRequests implements IRequests {\n fetch(url: string, options: IRequestOptions = {}): Promise<any> {\n return fetch(url, options);\n }\n}","import { IWebSocket, IWebSocketConfig } from \"../IWebSocket\";\nimport { Emits } from \"../../utils/Emits\";\nimport { IEventEmitter } from \"../../utils/IEventEmitter\";\nimport { EventEmitter } from \"../../utils/EventEmitter\";\nimport { generateConnectionToken } from \"../../data-sync/utils\";\nimport { StreamResponseEventType } from \"../../data-sync/types\";\nimport { IUser } from \"../../options/IUser\";\n\nconst socketConnectionIntervals = [1000, 3000, 5000, 7000, 11000, 13000, 30000, 60000];\n\nclass BrowserWebSocket implements IWebSocket {\n emitter: IEventEmitter;\n private ws?: WebSocket;\n private retryCounter = 0;\n private closed: boolean = false;\n\n private _config: IWebSocketConfig = {} as IWebSocketConfig;\n\n constructor() {\n this.emitter = new EventEmitter();\n }\n\n identify(user: IUser) {\n this._config.user = user;\n this.doDataSync();\n }\n\n connect() {\n let that = this;\n const startTime = Date.now();\n const url = this._config.streamingUri.replace(/^http/, 'ws') + `?type=client&token=${ generateConnectionToken(this._config.sdkKey) }`;\n this.ws = new WebSocket(url);\n\n // Connection opened\n that.ws?.addEventListener('open', function (this: WebSocket, event) {\n // this is the websocket instance to which the current listener is binded to, it's different from that.socket\n that._config.logger.info(`WebSocket connection succeeded, connection time: ${ Date.now() - startTime } ms`);\n that.doDataSync();\n that.sendPingMessage();\n });\n\n // Connection closed\n that.ws?.addEventListener('close', function (event) {\n that._config.logger.warn('WebSocket closed');\n if (event.code === 4003) { // do not reconnect when 4003\n return;\n }\n\n that.reconnect();\n });\n\n // Connection error\n that.ws?.addEventListener('error', function (event) {\n // reconnect\n that._config.logger.debug('error');\n });\n\n // Listen for messages\n that.ws?.addEventListener('message', function (event) {\n const message = JSON.parse(event.data as string);\n if (message.messageType === 'data-sync') {\n switch (message.data.eventType) {\n case StreamResponseEventType.patch:\n that.emitter.emit('patch', message);\n break;\n case StreamResponseEventType.full:\n that.emitter.emit('put', message);\n break;\n }\n }\n });\n }\n\n close() {\n this.closed = true;\n this.ws?.close(4003, 'The client is closed by user');\n this.ws = undefined;\n }\n\n config(param: IWebSocketConfig) {\n if (param.emitter) {\n this.emitter = param.emitter;\n }\n\n this._config = {...param};\n }\n\n private sendPingMessage() {\n const payload = {\n messageType: 'ping',\n data: null\n };\n\n setTimeout(() => {\n try {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this._config.logger.debug('sending ping')\n this.ws.send(JSON.stringify(payload));\n this.sendPingMessage();\n } else {\n this._config.logger.debug(`socket closed at ${ new Date() }`);\n }\n } catch (err) {\n this._config.logger.debug(err);\n }\n }, this._config.pingInterval);\n }\n\n private doDataSync() {\n const payload = {\n messageType: 'data-sync',\n data: {\n timestamp: this._config.getStoreTimestamp(),\n user: this._config.user\n }\n };\n\n try {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this._config.logger.debug('requesting data');\n this.ws?.send(JSON.stringify(payload));\n } else {\n this._config.logger.error(`not requesting data because socket not open`);\n }\n } catch (err) {\n this._config.logger.debug(err);\n }\n }\n\n private reconnect() {\n if (!this.closed) {\n this.ws = undefined;\n const waitTime = socketConnectionIntervals[Math.min(this.retryCounter++, socketConnectionIntervals.length - 1)];\n this._config.logger.info(`The client will try to reconnect in ${ waitTime } milliseconds.`);\n setTimeout(() => {\n this._config.logger.info(`The client is trying to reconnect, flag evaluation results may be stale until reconnected, waited for: ${ waitTime } milliseconds`);\n this.connect();\n }, waitTime);\n }\n }\n}\n\nexport default Emits(BrowserWebSocket);","import { FbClientCore } from \"../../FbClientCore\";\nimport { IOptions } from \"../../options/IOptions\";\nimport { BasicLogger } from \"../../logging/BasicLogger\";\nimport { EventEmitter } from \"../../utils/EventEmitter\";\nimport { SafeLogger } from \"../../logging/SafeLogger\";\nimport { Emits } from \"../../utils/Emits\";\nimport { IEventEmitter } from \"../../utils/IEventEmitter\";\nimport BrowserPlatform from \"./BrowserPlatform\";\nimport LocalStorageStore from \"./LocalStorageStore\";\nimport { IPlatform } from \"../IPlatform\";\n\n/**\n * @ignore\n */\nclass FbClient extends FbClientCore {\n emitter: IEventEmitter;\n\n constructor(options: IOptions, platform: IPlatform | undefined = undefined) {\n const fallbackLogger = new BasicLogger({\n level: 'none',\n destination: console.log\n });\n\n const logger = options.logger ? new SafeLogger(options.logger, fallbackLogger) : fallbackLogger;\n\n const emitter = new EventEmitter(logger);\n\n let { store } = options;\n if (!store) {\n store = new LocalStorageStore(options);\n }\n\n super(\n {...options, logger, store },\n platform ?? new BrowserPlatform({...options, logger}),\n {\n onError: (err: Error) => {\n if (emitter.listenerCount('error')) {\n emitter.emit('error', err);\n }\n },\n onFailed: (err: Error) => {\n emitter.emit('failed', err);\n },\n onReady: () => {\n emitter.emit('ready');\n },\n onUpdate: (keys: string[]) => {\n emitter.emit('update', [keys]);\n keys.forEach((key) => emitter.emit(`update:${ key }`, key));\n },\n hasEventListeners: () =>\n emitter\n .eventNames()\n .some(\n (name) =>\n name === 'update' || (typeof name === 'string' && name.startsWith('update:')),\n ),\n },\n );\n\n this.emitter = emitter;\n }\n}\n\nexport default Emits(FbClient);","import {\n StoreStorageKey,\n IStoreDataStorage, CurrentUserStorageKey\n} from \"../../store/store\";\nimport { IOptions } from \"../../options/IOptions\";\nimport { BaseStore } from \"../../store/BaseStore\";\nimport { ILogger } from \"../../logging\";\nimport { serializeUser } from \"../../utils/serializeUser\";\n\nexport default class LocalStorageStore extends BaseStore {\n private logger: ILogger;\n\n constructor(options: IOptions) {\n super();\n\n this.logger = options.logger!;\n }\n\n /* eslint-disable class-methods-use-this */\n close(): void {\n // For the LocalStorage store this is a no-op.\n }\n\n get description(): string {\n return 'local-storage-store'\n }\n\n // This method needs to be overridden in the child class\n protected async saveUser(): Promise<void> {\n localStorage.setItem(CurrentUserStorageKey, serializeUser(this._user));\n }\n\n protected override async dumpStoreToStorage() {\n const storageKey = `${StoreStorageKey}-${this._user.keyId}`;\n localStorage.setItem(storageKey, JSON.stringify(this.store));\n }\n\n protected override async loadStoreFromStorage() {\n const storageKey = `${StoreStorageKey}-${this._user.keyId}`;\n const dataStoreStr = localStorage.getItem(storageKey);\n let store: IStoreDataStorage | null = null;\n\n try {\n if (dataStoreStr && dataStoreStr.trim().length > 0) {\n store = JSON.parse(dataStoreStr);\n }\n } catch (err) {\n this.logger.error(`error while loading local data store: ${storageKey}`, err);\n }\n\n if (!!store) {\n this.store = store;\n } else {\n this.store = {\n flags: {},\n version: 0\n };\n }\n }\n}","export * from './IInfo';\nexport * from './IStore';\nexport * from './IPlatform';\nexport * from './IWebSocket';\nexport * from './requests';\nexport * from './browser/BrowserRequests';\n\nimport BrowserWebSocket from './browser/BrowserWebSocket';\n\nexport {\n BrowserWebSocket\n};","import { IStore } from \"../platform\";\nimport { IKeyedStoreItem, IStoreDataStorage, IStoreItem, IStoreKindData } from \"./store\";\nimport { IUser } from \"../options\";\nimport { IDataKind } from \"../IDataKind\";\n\nexport class BaseStore implements IStore {\n protected store: IStoreDataStorage = {} as IStoreDataStorage;\n\n protected initCalled = false;\n\n protected _user: IUser = {} as IUser;\n\n constructor() {\n }\n\n async identify(user: IUser) {\n this._user = {...user};\n\n await this.saveUser();\n await this.loadStoreFromStorage();\n }\n\n get user(): IUser {\n return this._user;\n }\n\n protected async addItem(kind: IDataKind, key: string, item: IStoreItem) {\n let items = this.store[kind.namespace];\n if (!items) {\n items = {};\n this.store[kind.namespace] = items;\n }\n if (Object.hasOwnProperty.call(items, key)) {\n const old = items[key];\n if (!old || old.version < item.version) {\n items[key] = item;\n }\n } else {\n items[key] = item;\n }\n\n if (item.version > this.store.version) {\n this.store.version = item.version;\n }\n\n await this.dumpStoreToStorage();\n }\n\n get(kind: IDataKind, key: string): IStoreItem | null {\n const items = this.store[kind.namespace];\n if (items) {\n if (Object.prototype.hasOwnProperty.call(items, key)) {\n const item = items[key];\n if (item) {\n return item;\n }\n }\n }\n return null;\n }\n\n all(kind: IDataKind): [IStoreKindData, number] {\n const result: IStoreKindData = {};\n const items = this.store[kind.namespace] ?? {};\n Object.entries(items).forEach(([key, item]) => {\n if (item) {\n result[key] = <IStoreItem>item;\n }\n });\n\n return [result, this.store.version];\n }\n\n async init(allData: IStoreDataStorage) {\n this.store = allData as IStoreDataStorage;\n\n Object.keys(allData).map(namespace => {\n Object.entries(allData[namespace]).forEach(([_, item]) => {\n const ele = item as IStoreItem;\n if (ele.version > this.store.version) {\n this.store.version = ele.version;\n }\n })\n });\n\n await this.dumpStoreToStorage();\n this.initCalled = true;\n }\n\n async upsert(kind: IDataKind, data: IKeyedStoreItem) {\n await this.addItem(kind, data.key, data);\n }\n\n initialized(): boolean {\n return this.initCalled;\n }\n\n /* eslint-disable class-methods-use-this */\n close(): void {\n // For the LocalStorage store this is a no-op.\n }\n\n get version(): number {\n return this.store.version;\n }\n\n // This getter needs to be overridden in the child class\n get description(): string {\n return '';\n }\n\n // This method needs to be overridden in the child class\n protected async saveUser(): Promise<void> {\n }\n\n // This method needs to be overridden in the child class\n protected async loadStoreFromStorage(): Promise<void> {\n }\n\n // This method needs to be overridden in the child class\n protected async dumpStoreToStorage(): Promise<void> {\n }\n}","import { IDataKind } from \"../IDataKind\";\n\nexport default class DataKinds {\n static readonly Flags: IDataKind = {\n namespace: 'flags'\n };\n}","import {\n StoreStorageKey,\n IStoreDataStorage\n} from \"./store\";\nimport { BaseStore } from \"./BaseStore\";\n\nexport default class InMemoryStore extends BaseStore {\n private allStores: { [DataStoreStorageKey: string]: IStoreDataStorage } = {};\n\n constructor() {\n super();\n }\n\n /* eslint-disable class-methods-use-this */\n close(): void {\n // For the LocalStorage store this is a no-op.\n }\n\n get description(): string {\n return 'in-memory-store'\n }\n\n protected async saveUser(): Promise<void> {\n // For in-memory store, this is a no-op.\n }\n\n protected override async dumpStoreToStorage() {\n const storageKey = `${StoreStorageKey}-${this._user.keyId}`;\n this.allStores[storageKey] = {...this.store};\n }\n\n protected override async loadStoreFromStorage() {\n const storageKey = `${StoreStorageKey}-${this._user.keyId}`;\n\n this.store = this.allStores[storageKey] ?? { flags: {}, version: 0 };\n }\n}","export * from './DataKinds';\nexport * from './IDataSourceUpdates';\nexport * from './InMemoryStore';\nexport * from './serialization';\nexport * from './store';\nexport * from './BaseStore';","import { IFlag } from \"../evaluation/data/IFlag\";\nimport DataKinds from \"./DataKinds\";\nimport { IVersionedData } from \"../IVersionedData\";\nimport { IDataKind } from \"../IDataKind\";\n\nexport interface Flags {\n flags: { [name: string]: IFlag };\n}\n\ntype VersionedFlag = IVersionedData & IFlag;\n\nexport interface IPatchData {\n data: VersionedFlag;\n kind: IDataKind;\n}\n\n/**\n * @internal\n */\nexport function deserializeAll(flags: IFlag[]): Flags {\n const result = {\n [DataKinds.Flags.namespace]: {}\n };\n\n if (flags?.length) {\n result[DataKinds.Flags.namespace] = flags.reduce((acc: any, cur: any) => {\n acc[cur.id] = {...cur, version: cur.timestamp || 0, key: cur.id, variations: cur.variationOptions};\n return acc;\n }, {});\n }\n\n return result as any as Flags;\n}\n\n/**\n * @internal\n */\nexport function deserializePatch(flags: IFlag[]): IPatchData[] {\n const result = [\n ...flags?.map(item => ({\n data: {\n ...item,\n version:item.timestamp,\n key: item.id,\n variations: item.variationOptions\n },\n kind: DataKinds.Flags\n })) || []\n ];\n\n return result as any as IPatchData[];\n}\n","export const StoreStorageKey = 'fb-datastore';\n\nexport const CurrentUserStorageKey = 'fb-user';\n\n/**\n * Represents an item which can be stored in the feature store.\n */\nexport interface IStoreItem {\n version: number;\n\n // The actual data associated with the item.\n [attribute: string]: any;\n}\n\n/**\n * When upserting an item it must contain a key.\n */\nexport interface IKeyedStoreItem extends IStoreItem {\n key: string;\n}\n\n/**\n * Represents the storage for a single kind of data. e.g. 'flag' or 'segment'.\n */\nexport interface IStoreKindData {\n [key: string]: IStoreItem;\n}\n\n/**\n * Represents the storage for the full data store.\n */\nexport interface IStoreDataStorage {\n flags: IStoreKindData;\n version: number;\n\n // This attribute is to ingore the type check error\n [attribute: string]: any;\n}","import { IEventEmitter } from \"./IEventEmitter\";\n\nexport type EventableConstructor<T = {}> = new (...args: any[]) => T;\nexport type Eventable = EventableConstructor<{ emitter: IEventEmitter }>;\n\n/**\n * Adds the implementation of an event emitter to something that contains\n * a field of `emitter` with type `EventEmitter`.\n * @param Base The class to derive the mixin from.\n * @returns A class extending the base with an event emitter.\n */\nexport function Emits<TBase extends Eventable>(Base: TBase) {\n return class WithEvents extends Base implements IEventEmitter {\n on(eventName: string | symbol, listener: (...args: any[]) => void, context?: any): this {\n this.emitter.on(eventName, listener, context);\n return this;\n }\n\n addListener(eventName: string | symbol, listener: (...args: any[]) => void, context?: any): this {\n this.emitter.addListener(eventName, listener, context);\n return this;\n }\n\n once(eventName: string | symbol, listener: (...args: any[]) => void, context?: any): this {\n this.emitter.once(eventName, listener, context);\n return this;\n }\n\n removeListener(eventName: string | symbol, listener: (...args: any[]) => void, context?: any): this {\n this.emitter.removeListener(eventName, listener, context);\n return this;\n }\n\n off(eventName: string | symbol, listener: (...args: any) => void, context?: any): this {\n this.emitter.off(eventName, listener, context);\n return this;\n }\n\n removeAllListeners(event?: string | symbol): this {\n this.emitter.removeAllListeners(event);\n return this;\n }\n\n listeners(eventName: string | symbol): Function[] {\n return this.emitter.listeners(eventName);\n }\n\n emit(eventName: string | symbol, ...args: any[]): this {\n this.emitter.emit(eventName, args);\n return this;\n }\n\n listenerCount(eventName: string | symbol): number {\n return this.emitter.listenerCount(eventName);\n }\n\n prependListener(eventName: string | symbol, listener: (...args: any[]) => void, context?: any): this {\n this.emitter.prependListener(eventName, listener, context);\n return this;\n }\n\n prependOnceListener(eventName: string | symbol, listener: (...args: any[]) => void, context?: any): this {\n this.emitter.prependOnceListener(eventName, listener, context);\n return this;\n }\n\n eventNames(): (string | symbol)[] {\n return this.emitter.eventNames();\n }\n\n maybeReportError (error: any): this {\n this.emitter.maybeReportError(error);\n return this;\n }\n };\n}","import { ILogger } from \"../logging/ILogger\";\nimport { IEventEmitter } from \"./IEventEmitter\";\n\ninterface Events {\n [key: string | symbol]: {\n handler: (...args: any[]) => void;\n context: any;\n }[];\n}\n\nexport class EventEmitter implements IEventEmitter {\n private events: Events = {};\n\n constructor(private logger?: ILogger) {}\n\n private listeningTo (event: string) {\n return !!this.events[event];\n }\n\n on (event: string | symbol, handler: (...args: any[]) => void, context?: any): this {\n this.events[event] = this.events[event] || [];\n this.events[event] = this.events[event].concat({\n handler: handler,\n context: context,\n });\n\n return this;\n }\n\n addListener (event: string | symbol, handler: (...args: any[]) => void, context?: any): this {\n return this.on(event, handler, context);\n }\n\n once (event: string | symbol, handler: (...args: any[]) => void, context?: any): this {\n const onceHandler = (...args: any[]) => {\n this.off(event, onceHandler, context);\n handler.apply(context, args);\n };\n return this.on(event, onceHandler, context);\n }\n\n off (event: string | symbol, handler: (...args: any[]) => void, context?: any): this {\n if (!this.events[event]) {\n return this;\n }\n for (let i = 0; i < this.events[event].length; i++) {\n if (this.events[event][i].handler === handler && this.events[event][i].context === context) {\n this.events[event] = this.events[event].slice(0, i).concat(this.events[event].slice(i + 1));\n }\n }\n\n return this;\n }\n\n removeListener (event: string | symbol, handler: (...args: any[]) => void, context?: any): this {\n return this.off(event, handler, context);\n }\n\n removeAllListeners (event?: string | symbol): this {\n if (event) {\n delete this.events[event];\n } else {\n this.events = {};\n }\n\n return this;\n }\n\n listeners (event: string | symbol): Function[] {\n return this.events[event] ? this.events[event].map((event) => event.handler) : [];\n }\n\n emit (event: string | symbol, ...args: any[]): this {\n if (!this.events[event]) {\n return this;\n }\n // Copy the list of handlers before iterating, in case any handler adds or removes another handler.\n // Any such changes should not affect what we do here-- we want to notify every handler that existed\n // at the moment that the event was fired.\n const copiedHandlers = [...this.events[event]];\n for (let i = 0; i < copiedHandlers.length; i++) {\n copiedHandlers[i].handler.apply(copiedHandlers[i].context, Array.prototype.slice.call(arguments, 1));\n }\n\n return this;\n }\n\n listenerCount (event: string | symbol): number {\n return this.events[event] ? this.events[event].length : 0;\n }\n\n prependListener (event: string | symbol, handler: (...args: any[]) => void, context?: any): this {\n this.events[event] = this.events[event] || [];\n this.events[event] = [\n {\n handler: handler,\n context: context,\n },\n ...this.events[event]\n ];\n\n return this;\n }\n\n prependOnceListener (event: string | symbol, handler: (...args: any[]) => void, context?: any): this {\n const onceHandler = (...args: any[]) => {\n this.off(event, onceHandler, context);\n handler.apply(context, args);\n };\n return this.prependListener(event, onceHandler, context);\n }\n\n eventNames (): (string | symbol)[] {\n return Object.keys(this.events);\n }\n\n maybeReportError (error: any): this {\n if (!error) {\n return this;\n }\n if (this.listeningTo('error')) {\n this.emit('error', error);\n } else {\n this.logger?.error(error);\n }\n\n return this;\n }\n}","import { Regex } from \"./Regex\";\n\nexport interface IConvertResult<TValue> {\n isSucceeded: boolean,\n value?: TValue\n}\n\nexport class ValueConverters {\n static bool(value: string): IConvertResult<boolean> {\n if (value?.toUpperCase() === 'TRUE') {\n return ValueConverters.success<boolean>(true);\n }\n\n if (value?.toUpperCase() === 'FALSE') {\n return ValueConverters.success<boolean>(false);\n }\n\n return ValueConverters.error<boolean>();\n }\n\n static number(value: string): IConvertResult<number> {\n const num = Number(value);\n\n if (Number.isNaN(num)) {\n return ValueConverters.error<number>();\n }\n\n return ValueConverters.success<number>(num);\n }\n\n static string(value: string): IConvertResult<string> {\n return ValueConverters.success<string>(value);\n }\n\n static json(value: string): IConvertResult<unknown> {\n try {\n const val = JSON.parse(value);\n return ValueConverters.success<unknown>(val);\n } catch (err) {\n return ValueConverters.error<unknown>();\n }\n }\n\n private static success<TValue>(value: TValue): IConvertResult<TValue> {\n return {\n isSucceeded: true,\n value: value\n }\n }\n\n private static error<TValue>(): IConvertResult<TValue> {\n return {\n isSucceeded: false\n }\n }\n}","// This function is designed to remove any trailing forward slashes at the end of the provided URI string\nexport function canonicalizeUri(uri: string): string {\n return uri.replace(/\\/+$/, '');\n}","/**\n * Wait before calling the same function. Useful for expensive calls.\n * Adapted from https://amitd.co/code/typescript/debounce.\n *\n * @return The debounced function.\n *\n * @example\n *\n * ```js\n * const debouncedFunction = debounce(e => {\n * console.log(e);\n * }, 5000);\n *\n * // Console logs 'Hello world again ' after 5 seconds\n * debouncedFunction('Hello world');\n * debouncedFunction('Hello world again');\n * ```\n * @param fn The function to be debounced.\n * @param delayMs Defaults to 5 seconds.\n */\nexport const debounce = <T extends (...args: any[]) => ReturnType<T>>(\n fn: T,\n delayMs: number = 5000,\n): ((...args: Parameters<T>) => void) => {\n let timer: ReturnType<typeof setTimeout>;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n fn(...args);\n }, delayMs);\n };\n};\n","import { IInfo } from \"../platform/IInfo\";\n\nexport type Headers = {\n Authorization: string;\n 'User-Agent': string;\n 'Content-Type': string;\n};\n\nexport function defaultHeaders(\n sdkKey: string,\n info: IInfo\n): Headers {\n const {userAgentBase, version} = info.sdkData();\n\n const headers: Headers = {\n 'Content-Type': 'application/json',\n 'User-Agent': `${ userAgentBase ?? info.appType }/${ version }`,\n 'Authorization': sdkKey\n };\n\n return headers;\n}\n\nexport function httpErrorMessage(\n err: {\n status: number;\n message: string;\n },\n context: string,\n retryMessage?: string,\n): string {\n let desc;\n if (err.status) {\n desc = `error ${ err.status }${ err.status === 401 ? ' (invalid SDK key)' : '' }`;\n } else {\n desc = `I/O error (${ err.message || err })`;\n }\n const action = retryMessage ?? 'giving up permanently';\n return `Received ${ desc } for ${ context } - ${ action }`;\n}\n","export * from './isNullOrUndefined';\nexport * from './sleep';\nexport * from './ValueConverters';\nexport * from './VoidFunction';\nexport * from './serializeUser';\nexport * from './debounce';","export function isNullOrUndefined(val: any) {\n return val === null || val === undefined;\n}","import { IUser } from \"../options/IUser\";\n\nexport function serializeUser(user: IUser | undefined): string {\n if (!user) {\n return '';\n }\n\n const builtInProperties = `${user.keyId},${user.name}`;\n\n const customizedProperties = user.customizedProperties\n ?.sort((a, b) => {\n const nameA = a.name.toLowerCase();\n const nameB = b.name.toLowerCase();\n if (nameA < nameB) {\n return -1;\n }\n\n if (nameA > nameB) {\n return 1;\n }\n\n return 0;\n })\n .map(p => `${p.name}:${p.value}`)\n .join(',');\n\n return `${builtInProperties},${customizedProperties}`;\n}","const sleep = async (delayMillis: number = 1000) =>\n new Promise((resolve) => {\n setTimeout(resolve, delayMillis);\n });\n\nexport default sleep;","export const version = \"3.0.2\"; export const name = \"@featbit/js-client-sdk\";\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(9872);\n"],"names":["root","factory","exports","module","define","amd","a","i","this","validations","startWaitTime","TypeValidators","Number","sdkKey","String","pollingUri","streamingUri","eventsUri","webSocketPingInterval","logger","Object","store","ObjectOrFactory","dataSynchronizer","flushInterval","maxEventsInQueue","pollingInterval","offline","Boolean","dataSyncMode","bootstrap","Bootstrap","user","User","defaultValues","DataSyncModeEnum","STREAMING","sendEvents","options","undefined","constructor","bootstrapProvider","NullBootstrapProvider","errors","validatedOptions","keys","forEach","optionName","optionValue","validator","is","getType","push","wrongOptionTypeBoolean","NumberWithMinimum","min","optionBelowMinimum","UserValidator","messages","wrongOptionType","warn","unknownOption","validateTypesAndNames","error","streamingUriMissing","isNullOrUndefined","EmptyString","pollingUriMissing","eventsUriMissing","partialEndpoint","POLLING","validateEndpoints","canonicalizeUri","length","JsonBootstrapProvider","_","info","Function","dataSynchronizerFactory","storeFactory","Context","valid","message","fromUser","contextForError","keyId","name","trim","context","_user","value","property","customizedProperties","find","x","_options","build","platform","_platform","mode","flags","ClientState","callbacks","state","Initializing","onError","onFailed","onReady","onUpdate","hasEventListeners","config","Error","init","clientContext","identify","dataSourceUpdates","evaluator","populate","eventProcessor","NullEventProcessor","NullDataSynchronizer","initSuccess","DefaultEventProcessor","listeners","createStreamListeners","put","patch","webSocket","version","requests","e","dataSourceErrorHandler","start","all","Flags","setTimeout","initialized","msg","Failed","rejectionReason","initReject","Initialized","waitForInitialization","initializedPromise","Promise","resolve","reject","initResolve","boolVariation","key","defaultValue","evaluateCore","ValueConverters","bool","boolVariationDetail","jsonVariation","json","jsonVariationDetail","numberVariation","number","numberVariationDetail","stringVariation","string","stringVariationDetail","variation","variationDetail","getAllVariations","ClientError","result","map","flagKey","evalResult","evaluate","kind","reason","close","track","eventName","metricValue","metricEvent","MetricEvent","appType","record","flush","callback","err","typeConverter","ReasonKinds","FlagNotFound","toEvalEvent","isSucceeded","WrongType","code","flag","variationOptions","id","data","deserializeAll","dataSet","userKeyId","MinInt","onChange","allData","checkForChanges","doInit","oldData","then","updatedKeys","flatMap","namespace","oldDataForKind","newDataForKind","mergedData","filter","isUpdated","upsert","doUpsert","oldItem","get","newData","createPutListener","onPutCompleteHandler","deserializeData","processJson","initData","debug","createPatchListener","onPatchCompleteHandler","deserializePatch","item","onCompleteHandlers","Map","set","stop","requestor","getStoreTimestamp","errorHandler","stopped","poll","startTime","Date","now","requestData","body","elapsed","sleepFor","Math","max","status","isHttpRecoverable","httpErrorMessage","PollingError","featureFlags","processStreamResponse","JSON","parse","messageType","eventType","StreamResponseEventType","full","timeoutHandle","clearTimeout","headers","defaultHeaders","uri","request","requestUrl","res","fetch","text","timestamp","payload","cb","method","stringify","StreamingError","socket","pingInterval","addListener","event","logConnectionStarted","connect","connectionAttemptStartTime","alphabet","encodeNumber","param","s","slice","split","n","join","replace","timestampCode","toString","floor","random","super","UnexpectedResponseError","EvalResult","flagNotFound","matched","val","Match","targetedVariation","variations","v","EvalEvent","sendToExperiment","VariationDataType","closed","eventQueue","DefaultEventQueue","eventDispatcher","EventDispatcher","flushLoop","flushEvent","FlushEvent","waitForCompletion","shutdown","ShutdownEvent","addEvent","complete","capacity","events","clear","shift","eventsSnapshot","isEmpty","send","retry","DeliveryStatus","Succeeded","FailedAndMustShutDown","serialize","toPayload","queue","maxEventPerRequest","buffer","sender","DefaultEventSender","serializer","DefaultEventSerializer","dispatchLoop","running","PayloadEvent","addEventToBuffer","triggerFlush","snapshot","flushEvents","total","getUniqueEvents","uniqueEvents","hashes","includes","hash","AsyncEvent","getTime","isCompletedPromise","resolveFn","userPayload","metrics","route","numericValue","type","hasObject","m","featureFlagKey","LogPriority","none","LevelNames","BasicLogger","logLevel","level","destination","formatter","tryFormat","args","tryWrite","console","log","prefix","loggerRequirements","fallback","entries","tryStringify","prototype","hasOwnProperty","call","TypeError","indexOf","escapes","d","toNumber","parseInt","toInt","f","parseFloat","toFloat","j","o","O","c","formatString","out","char","charAt","nextChar","configuration","expectedType","actualType","mandatory","invalidOptionValue","missingKeyInBootstrapValue","_keyId","_name","_custom","custom","propertyName","FactoryOrInstance","factoryOrInstance","Array","isArray","typeOfFactory","Type","typeName","example","typeOf","u","TypeArray","every","StringMatchingRegex","expression","match","NullableBoolean","DATE_REGEX","DateValidator","test","KindValidator","createTypeArray","numberWithMin","stringMatchingRegex","StringArray","Kind","platformData","os","additional","sdkData","userAgentBase","BrowserRequests","url","socketConnectionIntervals","Emits","retryCounter","_config","emitter","EventEmitter","doDataSync","that","generateConnectionToken","ws","WebSocket","addEventListener","sendPingMessage","reconnect","emit","readyState","OPEN","waitTime","FbClient","FbClientCore","fallbackLogger","SafeLogger","listenerCount","eventNames","some","startsWith","LocalStorageStore","BaseStore","description","saveUser","localStorage","setItem","CurrentUserStorageKey","serializeUser","dumpStoreToStorage","storageKey","StoreStorageKey","loadStoreFromStorage","dataStoreStr","getItem","BrowserWebSocket","initCalled","addItem","items","old","ele","DataKinds","InMemoryStore","allStores","reduce","acc","cur","Base","on","listener","once","removeListener","off","removeAllListeners","prependListener","prependOnceListener","maybeReportError","listeningTo","handler","concat","onceHandler","apply","copiedHandlers","arguments","toUpperCase","success","num","isNaN","debounce","fn","delayMs","timer","retryMessage","desc","sort","b","nameA","toLowerCase","nameB","p","delayMillis","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|