From 78e34e297198858e1f34235329ed4ade554b31cd Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Tue, 1 Apr 2025 08:51:38 -0700 Subject: [PATCH 1/2] fix: dont re-add plugin; remove integration timout error log --- packages/experiment-browser/src/factory.ts | 76 ++++++++++++------- .../src/integration/manager.ts | 3 +- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/packages/experiment-browser/src/factory.ts b/packages/experiment-browser/src/factory.ts index 5f880189..25f0aa6e 100644 --- a/packages/experiment-browser/src/factory.ts +++ b/packages/experiment-browser/src/factory.ts @@ -5,15 +5,12 @@ import { Defaults, ExperimentConfig } from './config'; import { ExperimentClient } from './experimentClient'; import { AmplitudeIntegrationPlugin } from './integration/amplitude'; import { DefaultUserProvider } from './providers/default'; +import { ExperimentPlugin } from './types/plugin'; // Global instances for debugging. safeGlobal.experimentInstances = {}; const instances = safeGlobal.experimentInstances; -const getInstanceName = (config: ExperimentConfig): string => { - return config?.instanceName || Defaults.instanceName; -}; - /** * Initializes a singleton {@link ExperimentClient} identified by the configured * instance name. @@ -25,23 +22,7 @@ export const initialize = ( apiKey: string, config?: ExperimentConfig, ): ExperimentClient => { - // Store instances by appending the instance name and api key. Allows for - // initializing multiple default instances for different api keys. - const instanceName = getInstanceName(config); - // The internal instance name prefix is used by web experiment to differentiate - // web and feature experiment sdks which use the same api key. - const internalInstanceNameSuffix = config?.['internalInstanceNameSuffix']; - const instanceKey = internalInstanceNameSuffix - ? `${instanceName}.${apiKey}.${internalInstanceNameSuffix}` - : `${instanceName}.${apiKey}`; - if (!instances[instanceKey]) { - config = { - ...config, - userProvider: new DefaultUserProvider(config?.userProvider, apiKey), - }; - instances[instanceKey] = new ExperimentClient(apiKey, config); - } - return instances[instanceKey]; + return _initialize(apiKey, config); }; /** @@ -59,15 +40,56 @@ export const initializeWithAmplitudeAnalytics = ( apiKey: string, config?: ExperimentConfig, ): ExperimentClient => { - const instanceName = getInstanceName(config); - const client = initialize(apiKey, config); - client.addPlugin( + const plugin = () => new AmplitudeIntegrationPlugin( apiKey, - AnalyticsConnector.getInstance(instanceName), + AnalyticsConnector.getInstance(getInstanceName(config)), 10000, - ), - ); + ); + return _initialize(apiKey, config, plugin); +}; + +const getInstanceName = (config: ExperimentConfig): string => { + return config?.instanceName || Defaults.instanceName; +}; + +const getInstanceKey = (apiKey: string, config: ExperimentConfig): string => { + // Store instances by appending the instance name and api key. Allows for + // initializing multiple default instances for different api keys. + const instanceName = getInstanceName(config); + // The internal instance name prefix is used by web experiment to differentiate + // web and feature experiment sdks which use the same api key. + const internalInstanceNameSuffix = config?.['internalInstanceNameSuffix']; + return internalInstanceNameSuffix + ? `${instanceName}.${apiKey}.${internalInstanceNameSuffix}` + : `${instanceName}.${apiKey}`; +}; + +const newExperimentClient = ( + apiKey: string, + config: ExperimentConfig, +): ExperimentClient => { + return new ExperimentClient(apiKey, { + ...config, + userProvider: new DefaultUserProvider(config?.userProvider, apiKey), + }); +}; + +const _initialize = ( + apiKey: string, + config?: ExperimentConfig, + plugin?: () => ExperimentPlugin, +): ExperimentClient => { + const instanceKey = getInstanceKey(apiKey, config); + let client = instances[instanceKey]; + if (client) { + return client; + } + client = newExperimentClient(apiKey, config); + if (plugin) { + client.addPlugin(plugin()); + } + instances[instanceKey] = client; return client; }; diff --git a/packages/experiment-browser/src/integration/manager.ts b/packages/experiment-browser/src/integration/manager.ts index 429532f6..109e8b51 100644 --- a/packages/experiment-browser/src/integration/manager.ts +++ b/packages/experiment-browser/src/integration/manager.ts @@ -64,8 +64,7 @@ export class IntegrationManager { this.queue.setTracker(this.integration.track.bind(integration)); this.resolve(); }, - (e) => { - console.error('Integration setup failed.', e); + () => { this.queue.setTracker(this.integration.track.bind(integration)); this.resolve(); }, From 2b2ed6bfbcb7577135dfcfcb275a0eb605894a77 Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Tue, 1 Apr 2025 10:25:55 -0700 Subject: [PATCH 2/2] fix: increase web exp integratino timeout to 1s --- packages/experiment-tag/src/experiment.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/experiment-tag/src/experiment.ts b/packages/experiment-tag/src/experiment.ts index eefe2461..88501892 100644 --- a/packages/experiment-tag/src/experiment.ts +++ b/packages/experiment-tag/src/experiment.ts @@ -230,7 +230,7 @@ export class DefaultWebExperimentClient implements WebExperimentClient { this.globalScope.experimentIntegration = new AmplitudeIntegrationPlugin( this.apiKey, connector, - 100, + 1000, ); } this.globalScope.experimentIntegration.type = 'integration';