diff --git a/lib/entrypoint.universal.test-d.ts b/lib/entrypoint.universal.test-d.ts index cde68ae97..0dcc3a671 100644 --- a/lib/entrypoint.universal.test-d.ts +++ b/lib/entrypoint.universal.test-d.ts @@ -49,6 +49,9 @@ import { LogLevel } from './logging/logger'; import { OptimizelyDecideOption } from './shared_types'; import { UniversalConfig } from './index.universal'; +import { OpaqueOdpManager } from './odp/odp_manager_factory'; + +import { UniversalOdpManagerOptions } from './odp/odp_manager_factory.universal'; export type UniversalEntrypoint = { // client factory @@ -63,8 +66,7 @@ export type UniversalEntrypoint = { createForwardingEventProcessor: (eventDispatcher: EventDispatcher) => OpaqueEventProcessor; createBatchEventProcessor: (options: UniversalBatchEventProcessorOptions) => OpaqueEventProcessor; - // TODO: odp manager related exports - // createOdpManager: (options: OdpManagerOptions) => OpaqueOdpManager; + createOdpManager: (options: UniversalOdpManagerOptions) => OpaqueOdpManager; // TODO: vuid manager related exports // createVuidManager: (options: VuidManagerOptions) => OpaqueVuidManager; diff --git a/lib/export_types.ts b/lib/export_types.ts index fba5cde09..42e6778b9 100644 --- a/lib/export_types.ts +++ b/lib/export_types.ts @@ -39,6 +39,10 @@ export type { OpaqueOdpManager, } from './odp/odp_manager_factory'; +export type { + UserAgentParser, +} from './odp/ua_parser/user_agent_parser'; + // Vuid manager related types export type { VuidManagerOptions, diff --git a/lib/index.universal.ts b/lib/index.universal.ts index 6bd233a32..5cc64f51e 100644 --- a/lib/index.universal.ts +++ b/lib/index.universal.ts @@ -39,8 +39,9 @@ export { createPollingProjectConfigManager } from './project_config/config_manag export { createForwardingEventProcessor, createBatchEventProcessor } from './event_processor/event_processor_factory.universal'; -// TODO: decide on universal odp manager factory interface -// export { createOdpManager } from './odp/odp_manager_factory.node'; +export { createOdpManager } from './odp/odp_manager_factory.universal'; + +// TODO: decide on vuid manager API for universal // export { createVuidManager } from './vuid/vuid_manager_factory.node'; export * from './common_exports'; @@ -67,6 +68,15 @@ export type { export type { UniversalBatchEventProcessorOptions } from './event_processor/event_processor_factory.universal'; +// odp manager related types +export type { + UniversalOdpManagerOptions, +} from './odp/odp_manager_factory.universal'; + +export type { + UserAgentParser, +} from './odp/ua_parser/user_agent_parser'; + export type { OpaqueEventProcessor, } from './event_processor/event_processor_factory'; diff --git a/lib/odp/odp_manager_factory.browser.spec.ts b/lib/odp/odp_manager_factory.browser.spec.ts index d8ecc8605..75edcdf3d 100644 --- a/lib/odp/odp_manager_factory.browser.spec.ts +++ b/lib/odp/odp_manager_factory.browser.spec.ts @@ -117,9 +117,7 @@ describe('createOdpManager', () => { segmentsCache: {} as any, segmentsCacheSize: 11, segmentsCacheTimeout: 2025, - segmentManager: {} as any, eventFlushInterval: 2222, - eventManager: {} as any, userAgentParser: {} as any, }; const odpManager = createOdpManager(options); diff --git a/lib/odp/odp_manager_factory.node.spec.ts b/lib/odp/odp_manager_factory.node.spec.ts index f89d6ce94..ac3bcb4ce 100644 --- a/lib/odp/odp_manager_factory.node.spec.ts +++ b/lib/odp/odp_manager_factory.node.spec.ts @@ -117,8 +117,6 @@ describe('createOdpManager', () => { segmentsCache: {} as any, segmentsCacheSize: 11, segmentsCacheTimeout: 2025, - segmentManager: {} as any, - eventManager: {} as any, userAgentParser: {} as any, }; const odpManager = createOdpManager(options); diff --git a/lib/odp/odp_manager_factory.node.ts b/lib/odp/odp_manager_factory.node.ts index e59c657bd..7b8f737a7 100644 --- a/lib/odp/odp_manager_factory.node.ts +++ b/lib/odp/odp_manager_factory.node.ts @@ -16,7 +16,6 @@ import { NodeRequestHandler } from '../utils/http_request_handler/request_handler.node'; import { eventApiRequestGenerator } from './event_manager/odp_event_api_manager'; -import { OdpManager } from './odp_manager'; import { getOpaqueOdpManager, OdpManagerOptions, OpaqueOdpManager } from './odp_manager_factory'; export const NODE_DEFAULT_API_TIMEOUT = 10_000; diff --git a/lib/odp/odp_manager_factory.react_native.spec.ts b/lib/odp/odp_manager_factory.react_native.spec.ts index fd703d362..95d7be4fc 100644 --- a/lib/odp/odp_manager_factory.react_native.spec.ts +++ b/lib/odp/odp_manager_factory.react_native.spec.ts @@ -117,8 +117,6 @@ describe('createOdpManager', () => { segmentsCache: {} as any, segmentsCacheSize: 11, segmentsCacheTimeout: 2025, - segmentManager: {} as any, - eventManager: {} as any, userAgentParser: {} as any, }; const odpManager = createOdpManager(options); diff --git a/lib/odp/odp_manager_factory.spec.ts b/lib/odp/odp_manager_factory.spec.ts index 94aa565e5..9815f3085 100644 --- a/lib/odp/odp_manager_factory.spec.ts +++ b/lib/odp/odp_manager_factory.spec.ts @@ -90,22 +90,7 @@ describe('getOdpManager', () => { MockExponentialBackoff.mockClear(); }); - it('should use provided segment manager', () => { - const segmentManager = {} as any; - - const odpManager = getOdpManager({ - segmentManager, - segmentRequestHandler: getMockRequestHandler(), - eventRequestHandler: getMockRequestHandler(), - eventRequestGenerator: vi.fn(), - }); - - expect(Object.is(odpManager, MockDefaultOdpManager.mock.instances[0])).toBe(true); - const { segmentManager: usedSegmentManager } = MockDefaultOdpManager.mock.calls[0][0]; - expect(usedSegmentManager).toBe(segmentManager); - }); - - describe('when no segment manager is provided', () => { + describe('segment manager', () => { it('should create a default segment manager with default api manager using the passed eventRequestHandler', () => { const segmentRequestHandler = getMockRequestHandler(); const odpManager = getOdpManager({ @@ -205,22 +190,7 @@ describe('getOdpManager', () => { }); }); - it('uses provided event manager', () => { - const eventManager = {} as any; - - const odpManager = getOdpManager({ - eventManager, - segmentRequestHandler: getMockRequestHandler(), - eventRequestHandler: getMockRequestHandler(), - eventRequestGenerator: vi.fn(), - }); - - expect(odpManager).toBe(MockDefaultOdpManager.mock.instances[0]); - const { eventManager: usedEventManager } = MockDefaultOdpManager.mock.calls[0][0]; - expect(usedEventManager).toBe(eventManager); - }); - - describe('when no event manager is provided', () => { + describe('event manager', () => { it('should use a default event manager with default api manager using the passed eventRequestHandler and eventRequestGenerator', () => { const eventRequestHandler = getMockRequestHandler(); const eventRequestGenerator = vi.fn(); diff --git a/lib/odp/odp_manager_factory.ts b/lib/odp/odp_manager_factory.ts index 12d229d4b..91504d5e6 100644 --- a/lib/odp/odp_manager_factory.ts +++ b/lib/odp/odp_manager_factory.ts @@ -45,11 +45,9 @@ export type OdpManagerOptions = { segmentsCacheSize?: number; segmentsCacheTimeout?: number; segmentsApiTimeout?: number; - segmentManager?: OdpSegmentManager; eventFlushInterval?: number; eventBatchSize?: number; eventApiTimeout?: number; - eventManager?: OdpEventManager; userAgentParser?: UserAgentParser; }; @@ -90,8 +88,8 @@ const getDefaultEventManager = (options: OdpManagerFactoryOptions) => { } export const getOdpManager = (options: OdpManagerFactoryOptions): OdpManager => { - const segmentManager = options.segmentManager || getDefaultSegmentManager(options); - const eventManager = options.eventManager || getDefaultEventManager(options); + const segmentManager = getDefaultSegmentManager(options); + const eventManager = getDefaultEventManager(options); return new DefaultOdpManager({ segmentManager, diff --git a/lib/odp/odp_manager_factory.universal.ts b/lib/odp/odp_manager_factory.universal.ts new file mode 100644 index 000000000..9ad2bc250 --- /dev/null +++ b/lib/odp/odp_manager_factory.universal.ts @@ -0,0 +1,38 @@ +/** + * Copyright 2025, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { RequestHandler } from '../utils/http_request_handler/http'; +import { eventApiRequestGenerator } from './event_manager/odp_event_api_manager'; +import { getOpaqueOdpManager, OdpManagerOptions, OpaqueOdpManager } from './odp_manager_factory'; + +export const DEFAULT_API_TIMEOUT = 10_000; +export const DEFAULT_BATCH_SIZE = 1; +export const DEFAULT_FLUSH_INTERVAL = 1000; + +export type UniversalOdpManagerOptions = OdpManagerOptions & { + requestHandler: RequestHandler; +}; + +export const createOdpManager = (options: UniversalOdpManagerOptions): OpaqueOdpManager => { + return getOpaqueOdpManager({ + ...options, + segmentRequestHandler: options.requestHandler, + eventRequestHandler: options.requestHandler, + eventBatchSize: options.eventBatchSize || DEFAULT_BATCH_SIZE, + eventFlushInterval: options.eventFlushInterval || DEFAULT_FLUSH_INTERVAL, + eventRequestGenerator: eventApiRequestGenerator, + }); +}; diff --git a/lib/vuid/vuid_manager_factory.browser.ts b/lib/vuid/vuid_manager_factory.browser.ts index 8aee22f97..0691fd5e7 100644 --- a/lib/vuid/vuid_manager_factory.browser.ts +++ b/lib/vuid/vuid_manager_factory.browser.ts @@ -26,4 +26,3 @@ export const createVuidManager = (options: VuidManagerOptions = {}): OpaqueVuidM enableVuid: options.enableVuid })); }; -