Skip to content

Commit 6474eee

Browse files
committed
a
1 parent 506d441 commit 6474eee

22 files changed

+206
-122
lines changed

lib/entrypoint.test-d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { expectTypeOf } from 'vitest';
2+
3+
import * as browserEntrypoint from './index.browser';
4+
import * as nodeEntrypoint from './index.node';
5+
import * as reactNativeEntrypoint from './index.react_native';
6+
7+
import { Config, Client } from './shared_types';
8+
9+
export type Entrypoint = {
10+
createInstance: (config: Config) => Client | null;
11+
}
12+
13+
expectTypeOf(browserEntrypoint).toMatchTypeOf<Entrypoint>();
14+
expectTypeOf(nodeEntrypoint).toMatchTypeOf<Entrypoint>();
15+
expectTypeOf(reactNativeEntrypoint).toMatchTypeOf<Entrypoint>();

lib/event_processor/event_processor_factory.browser.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { getForwardingEventProcessor } from './forwarding_event_processor';
1818
import { EventDispatcher } from './event_dispatcher/event_dispatcher';
1919
import { EventProcessor } from './event_processor';
2020
import { EventWithId } from './batch_event_processor';
21-
import { getBatchEventProcessor, BatchEventProcessorOptions } from './event_processor_factory';
21+
import { getOpaqueBatchEventProcessor, BatchEventProcessorOptions, OpaqueEventProcessor } from './event_processor_factory';
2222
import defaultEventDispatcher from './event_dispatcher/default_dispatcher.browser';
2323
import sendBeaconEventDispatcher from './event_dispatcher/send_beacon_dispatcher.browser';
2424
import { LocalStorageCache } from '../utils/cache/local_storage_cache.browser';
@@ -35,15 +35,15 @@ const identity = <T>(v: T): T => v;
3535

3636
export const createBatchEventProcessor = (
3737
options: BatchEventProcessorOptions
38-
): EventProcessor => {
38+
): OpaqueEventProcessor => {
3939
const localStorageCache = new LocalStorageCache<EventWithId>();
4040
const eventStore = new SyncPrefixCache<EventWithId, EventWithId>(
4141
localStorageCache, EVENT_STORE_PREFIX,
4242
identity,
4343
identity,
4444
);
4545

46-
return getBatchEventProcessor({
46+
return getOpaqueBatchEventProcessor({
4747
eventDispatcher: options.eventDispatcher || defaultEventDispatcher,
4848
closingEventDispatcher: options.closingEventDispatcher ||
4949
(options.eventDispatcher ? undefined : sendBeaconEventDispatcher),

lib/event_processor/event_processor_factory.node.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { getForwardingEventProcessor } from './forwarding_event_processor';
1717
import { EventDispatcher } from './event_dispatcher/event_dispatcher';
1818
import { EventProcessor } from './event_processor';
1919
import defaultEventDispatcher from './event_dispatcher/default_dispatcher.node';
20-
import { BatchEventProcessorOptions, FAILED_EVENT_RETRY_INTERVAL, getBatchEventProcessor, getPrefixEventStore } from './event_processor_factory';
20+
import { BatchEventProcessorOptions, FAILED_EVENT_RETRY_INTERVAL, getOpaqueBatchEventProcessor, getPrefixEventStore, OpaqueEventProcessor } from './event_processor_factory';
2121

2222
export const createForwardingEventProcessor = (
2323
eventDispatcher: EventDispatcher = defaultEventDispatcher,
@@ -28,10 +28,10 @@ export const createForwardingEventProcessor = (
2828

2929
export const createBatchEventProcessor = (
3030
options: BatchEventProcessorOptions
31-
): EventProcessor => {
31+
): OpaqueEventProcessor => {
3232
const eventStore = options.eventStore ? getPrefixEventStore(options.eventStore) : undefined;
3333

34-
return getBatchEventProcessor({
34+
return getOpaqueBatchEventProcessor({
3535
eventDispatcher: options.eventDispatcher || defaultEventDispatcher,
3636
closingEventDispatcher: options.closingEventDispatcher,
3737
flushInterval: options.flushInterval,

lib/event_processor/event_processor_factory.react_native.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { getForwardingEventProcessor } from './forwarding_event_processor';
1717
import { EventDispatcher } from './event_dispatcher/event_dispatcher';
1818
import { EventProcessor } from './event_processor';
1919
import defaultEventDispatcher from './event_dispatcher/default_dispatcher.browser';
20-
import { BatchEventProcessorOptions, getBatchEventProcessor, getPrefixEventStore } from './event_processor_factory';
20+
import { BatchEventProcessorOptions, getOpaqueBatchEventProcessor, getPrefixEventStore, OpaqueEventProcessor } from './event_processor_factory';
2121
import { EVENT_STORE_PREFIX, FAILED_EVENT_RETRY_INTERVAL } from './event_processor_factory';
2222
import { AsyncPrefixCache } from '../utils/cache/cache';
2323
import { BatchEventProcessor, EventWithId } from './batch_event_processor';
@@ -48,10 +48,10 @@ const getDefaultEventStore = () => {
4848

4949
export const createBatchEventProcessor = (
5050
options: BatchEventProcessorOptions
51-
): EventProcessor => {
51+
): OpaqueEventProcessor => {
5252
const eventStore = options.eventStore ? getPrefixEventStore(options.eventStore) : getDefaultEventStore();
5353

54-
return getBatchEventProcessor({
54+
return getOpaqueBatchEventProcessor({
5555
eventDispatcher: options.eventDispatcher || defaultEventDispatcher,
5656
closingEventDispatcher: options.closingEventDispatcher,
5757
flushInterval: options.flushInterval,

lib/event_processor/event_processor_factory.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ export const getPrefixEventStore = (cache: Cache<string>): Cache<EventWithId> =>
4646
}
4747
};
4848

49+
const eventProcessorSymbol: unique symbol = Symbol();
50+
51+
export type OpaqueEventProcessor = {
52+
[eventProcessorSymbol]: unknown;
53+
};
54+
4955
export type BatchEventProcessorOptions = {
5056
eventDispatcher?: EventDispatcher;
5157
closingEventDispatcher?: EventDispatcher;
@@ -118,4 +124,17 @@ export const getBatchEventProcessor = (
118124
eventStore,
119125
startupLogs,
120126
});
121-
};
127+
}
128+
129+
export const getOpaqueBatchEventProcessor = (
130+
options: BatchEventProcessorFactoryOptions,
131+
EventProcessorConstructor: typeof BatchEventProcessor = BatchEventProcessor
132+
): OpaqueEventProcessor => {
133+
return {
134+
[eventProcessorSymbol]: getBatchEventProcessor(options, EventProcessorConstructor),
135+
};
136+
}
137+
138+
export const extractEventProcessor = (eventProcessor: OpaqueEventProcessor): EventProcessor => {
139+
return eventProcessor[eventProcessorSymbol] as EventProcessor;
140+
}

lib/odp/odp_manager_factory.browser.spec.ts

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,79 +19,82 @@ vi.mock('../utils/http_request_handler/request_handler.browser', () => {
1919
});
2020

2121
vi.mock('./odp_manager_factory', () => {
22-
return { getOdpManager: vi.fn().mockImplementation(() => ({})) };
22+
return {
23+
getOdpManager: vi.fn().mockImplementation(() => ({})),
24+
getOpaqueOdpManager: vi.fn().mockImplementation(() => ({}))
25+
};
2326
});
2427

2528

2629
import { describe, it, expect, beforeEach, vi } from 'vitest';
27-
import { getOdpManager, OdpManagerOptions } from './odp_manager_factory';
30+
import { getOpaqueOdpManager, OdpManagerOptions } from './odp_manager_factory';
2831
import { BROWSER_DEFAULT_API_TIMEOUT, createOdpManager } from './odp_manager_factory.browser';
2932
import { BrowserRequestHandler } from '../utils/http_request_handler/request_handler.browser';
3033
import { pixelApiRequestGenerator } from './event_manager/odp_event_api_manager';
3134

3235
describe('createOdpManager', () => {
3336
const MockBrowserRequestHandler = vi.mocked(BrowserRequestHandler);
34-
const mockGetOdpManager = vi.mocked(getOdpManager);
37+
const mockGetOpaqueOdpManager = vi.mocked(getOpaqueOdpManager);
3538

3639
beforeEach(() => {
3740
MockBrowserRequestHandler.mockClear();
38-
mockGetOdpManager.mockClear();
41+
mockGetOpaqueOdpManager.mockClear();
3942
});
4043

4144
it('should use BrowserRequestHandler with the provided timeout as the segment request handler', () => {
4245
const odpManager = createOdpManager({ segmentsApiTimeout: 3456 });
43-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
44-
const { segmentRequestHandler } = mockGetOdpManager.mock.calls[0][0];
46+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
47+
const { segmentRequestHandler } = mockGetOpaqueOdpManager.mock.calls[0][0];
4548
expect(segmentRequestHandler).toBe(MockBrowserRequestHandler.mock.instances[0]);
4649
const requestHandlerOptions = MockBrowserRequestHandler.mock.calls[0][0];
4750
expect(requestHandlerOptions?.timeout).toBe(3456);
4851
});
4952

5053
it('should use BrowserRequestHandler with the browser default timeout as the segment request handler', () => {
5154
const odpManager = createOdpManager({});
52-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
53-
const { segmentRequestHandler } = mockGetOdpManager.mock.calls[0][0];
55+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
56+
const { segmentRequestHandler } = mockGetOpaqueOdpManager.mock.calls[0][0];
5457
expect(segmentRequestHandler).toBe(MockBrowserRequestHandler.mock.instances[0]);
5558
const requestHandlerOptions = MockBrowserRequestHandler.mock.calls[0][0];
5659
expect(requestHandlerOptions?.timeout).toBe(BROWSER_DEFAULT_API_TIMEOUT);
5760
});
5861

5962
it('should use BrowserRequestHandler with the provided timeout as the event request handler', () => {
6063
const odpManager = createOdpManager({ eventApiTimeout: 2345 });
61-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
62-
const { eventRequestHandler } = mockGetOdpManager.mock.calls[0][0];
64+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
65+
const { eventRequestHandler } = mockGetOpaqueOdpManager.mock.calls[0][0];
6366
expect(eventRequestHandler).toBe(MockBrowserRequestHandler.mock.instances[1]);
6467
const requestHandlerOptions = MockBrowserRequestHandler.mock.calls[1][0];
6568
expect(requestHandlerOptions?.timeout).toBe(2345);
6669
});
6770

6871
it('should use BrowserRequestHandler with the browser default timeout as the event request handler', () => {
6972
const odpManager = createOdpManager({});
70-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
71-
const { eventRequestHandler } = mockGetOdpManager.mock.calls[0][0];
73+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
74+
const { eventRequestHandler } = mockGetOpaqueOdpManager.mock.calls[0][0];
7275
expect(eventRequestHandler).toBe(MockBrowserRequestHandler.mock.instances[1]);
7376
const requestHandlerOptions = MockBrowserRequestHandler.mock.calls[1][0];
7477
expect(requestHandlerOptions?.timeout).toBe(BROWSER_DEFAULT_API_TIMEOUT);
7578
});
7679

7780
it('should use batchSize 1 if batchSize is not provided', () => {
7881
const odpManager = createOdpManager({});
79-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
80-
const { eventBatchSize } = mockGetOdpManager.mock.calls[0][0];
82+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
83+
const { eventBatchSize } = mockGetOpaqueOdpManager.mock.calls[0][0];
8184
expect(eventBatchSize).toBe(1);
8285
});
8386

8487
it('should use batchSize 1 event if some other batchSize value is provided', () => {
8588
const odpManager = createOdpManager({ eventBatchSize: 99 });
86-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
87-
const { eventBatchSize } = mockGetOdpManager.mock.calls[0][0];
89+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
90+
const { eventBatchSize } = mockGetOpaqueOdpManager.mock.calls[0][0];
8891
expect(eventBatchSize).toBe(1);
8992
});
9093

9194
it('uses the pixel api request generator', () => {
9295
const odpManager = createOdpManager({ });
93-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
94-
const { eventRequestGenerator } = mockGetOdpManager.mock.calls[0][0];
96+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
97+
const { eventRequestGenerator } = mockGetOpaqueOdpManager.mock.calls[0][0];
9598
expect(eventRequestGenerator).toBe(pixelApiRequestGenerator);
9699
});
97100

@@ -106,7 +109,7 @@ describe('createOdpManager', () => {
106109
userAgentParser: {} as any,
107110
};
108111
const odpManager = createOdpManager(options);
109-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
110-
expect(mockGetOdpManager).toHaveBeenNthCalledWith(1, expect.objectContaining(options));
112+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
113+
expect(mockGetOpaqueOdpManager).toHaveBeenNthCalledWith(1, expect.objectContaining(options));
111114
});
112115
});

lib/odp/odp_manager_factory.browser.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
import { BrowserRequestHandler } from '../utils/http_request_handler/request_handler.browser';
1818
import { pixelApiRequestGenerator } from './event_manager/odp_event_api_manager';
1919
import { OdpManager } from './odp_manager';
20-
import { getOdpManager, OdpManagerOptions } from './odp_manager_factory';
20+
import { getOpaqueOdpManager, OdpManagerOptions, OpaqueOdpManager } from './odp_manager_factory';
2121

2222
export const BROWSER_DEFAULT_API_TIMEOUT = 10_000;
2323

24-
export const createOdpManager = (options: OdpManagerOptions): OdpManager => {
24+
export const createOdpManager = (options: OdpManagerOptions): OpaqueOdpManager => {
2525
const segmentRequestHandler = new BrowserRequestHandler({
2626
timeout: options.segmentsApiTimeout || BROWSER_DEFAULT_API_TIMEOUT,
2727
});
@@ -30,7 +30,7 @@ export const createOdpManager = (options: OdpManagerOptions): OdpManager => {
3030
timeout: options.eventApiTimeout || BROWSER_DEFAULT_API_TIMEOUT,
3131
});
3232

33-
return getOdpManager({
33+
return getOpaqueOdpManager({
3434
...options,
3535
eventBatchSize: 1,
3636
segmentRequestHandler,

lib/odp/odp_manager_factory.node.spec.ts

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,93 +19,96 @@ vi.mock('../utils/http_request_handler/request_handler.node', () => {
1919
});
2020

2121
vi.mock('./odp_manager_factory', () => {
22-
return { getOdpManager: vi.fn().mockImplementation(() => ({})) };
22+
return {
23+
getOdpManager: vi.fn().mockImplementation(() => ({})),
24+
getOpaqueOdpManager: vi.fn().mockImplementation(() => ({}))
25+
};
2326
});
2427

2528

2629
import { describe, it, expect, beforeEach, vi } from 'vitest';
27-
import { getOdpManager, OdpManagerOptions } from './odp_manager_factory';
30+
import { getOpaqueOdpManager, OdpManagerOptions } from './odp_manager_factory';
2831
import { NODE_DEFAULT_API_TIMEOUT, NODE_DEFAULT_BATCH_SIZE, NODE_DEFAULT_FLUSH_INTERVAL, createOdpManager } from './odp_manager_factory.node';
2932
import { NodeRequestHandler } from '../utils/http_request_handler/request_handler.node';
3033
import { eventApiRequestGenerator } from './event_manager/odp_event_api_manager';
3134

3235
describe('createOdpManager', () => {
3336
const MockNodeRequestHandler = vi.mocked(NodeRequestHandler);
34-
const mockGetOdpManager = vi.mocked(getOdpManager);
37+
const mockGetOpaqueOdpManager = vi.mocked(getOpaqueOdpManager);
3538

3639
beforeEach(() => {
3740
MockNodeRequestHandler.mockClear();
38-
mockGetOdpManager.mockClear();
41+
mockGetOpaqueOdpManager.mockClear();
3942
});
4043

4144
it('should use NodeRequestHandler with the provided timeout as the segment request handler', () => {
4245
const odpManager = createOdpManager({ segmentsApiTimeout: 3456 });
43-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
44-
const { segmentRequestHandler } = mockGetOdpManager.mock.calls[0][0];
46+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
47+
const { segmentRequestHandler } = mockGetOpaqueOdpManager.mock.calls[0][0];
4548
expect(segmentRequestHandler).toBe(MockNodeRequestHandler.mock.instances[0]);
4649
const requestHandlerOptions = MockNodeRequestHandler.mock.calls[0][0];
4750
expect(requestHandlerOptions?.timeout).toBe(3456);
4851
});
4952

5053
it('should use NodeRequestHandler with the node default timeout as the segment request handler', () => {
5154
const odpManager = createOdpManager({});
52-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
53-
const { segmentRequestHandler } = mockGetOdpManager.mock.calls[0][0];
55+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
56+
const { segmentRequestHandler } = mockGetOpaqueOdpManager.mock.calls[0][0];
5457
expect(segmentRequestHandler).toBe(MockNodeRequestHandler.mock.instances[0]);
5558
const requestHandlerOptions = MockNodeRequestHandler.mock.calls[0][0];
5659
expect(requestHandlerOptions?.timeout).toBe(NODE_DEFAULT_API_TIMEOUT);
5760
});
5861

5962
it('should use NodeRequestHandler with the provided timeout as the event request handler', () => {
6063
const odpManager = createOdpManager({ eventApiTimeout: 2345 });
61-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
62-
const { eventRequestHandler } = mockGetOdpManager.mock.calls[0][0];
64+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
65+
const { eventRequestHandler } = mockGetOpaqueOdpManager.mock.calls[0][0];
6366
expect(eventRequestHandler).toBe(MockNodeRequestHandler.mock.instances[1]);
6467
const requestHandlerOptions = MockNodeRequestHandler.mock.calls[1][0];
6568
expect(requestHandlerOptions?.timeout).toBe(2345);
6669
});
6770

6871
it('should use NodeRequestHandler with the node default timeout as the event request handler', () => {
6972
const odpManager = createOdpManager({});
70-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
71-
const { eventRequestHandler } = mockGetOdpManager.mock.calls[0][0];
73+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
74+
const { eventRequestHandler } = mockGetOpaqueOdpManager.mock.calls[0][0];
7275
expect(eventRequestHandler).toBe(MockNodeRequestHandler.mock.instances[1]);
7376
const requestHandlerOptions = MockNodeRequestHandler.mock.calls[1][0];
7477
expect(requestHandlerOptions?.timeout).toBe(NODE_DEFAULT_API_TIMEOUT);
7578
});
7679

7780
it('uses the event api request generator', () => {
7881
const odpManager = createOdpManager({ });
79-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
80-
const { eventRequestGenerator } = mockGetOdpManager.mock.calls[0][0];
82+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
83+
const { eventRequestGenerator } = mockGetOpaqueOdpManager.mock.calls[0][0];
8184
expect(eventRequestGenerator).toBe(eventApiRequestGenerator);
8285
});
8386

8487
it('should use the provided eventBatchSize', () => {
8588
const odpManager = createOdpManager({ eventBatchSize: 99 });
86-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
87-
const { eventBatchSize } = mockGetOdpManager.mock.calls[0][0];
89+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
90+
const { eventBatchSize } = mockGetOpaqueOdpManager.mock.calls[0][0];
8891
expect(eventBatchSize).toBe(99);
8992
});
9093

9194
it('should use the node default eventBatchSize if none provided', () => {
9295
const odpManager = createOdpManager({});
93-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
94-
const { eventBatchSize } = mockGetOdpManager.mock.calls[0][0];
96+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
97+
const { eventBatchSize } = mockGetOpaqueOdpManager.mock.calls[0][0];
9598
expect(eventBatchSize).toBe(NODE_DEFAULT_BATCH_SIZE);
9699
});
97100

98101
it('should use the provided eventFlushInterval', () => {
99102
const odpManager = createOdpManager({ eventFlushInterval: 9999 });
100-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
101-
const { eventFlushInterval } = mockGetOdpManager.mock.calls[0][0];
103+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
104+
const { eventFlushInterval } = mockGetOpaqueOdpManager.mock.calls[0][0];
102105
expect(eventFlushInterval).toBe(9999);
103106
});
104107

105108
it('should use the node default eventFlushInterval if none provided', () => {
106109
const odpManager = createOdpManager({});
107-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
108-
const { eventFlushInterval } = mockGetOdpManager.mock.calls[0][0];
110+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
111+
const { eventFlushInterval } = mockGetOpaqueOdpManager.mock.calls[0][0];
109112
expect(eventFlushInterval).toBe(NODE_DEFAULT_FLUSH_INTERVAL);
110113
});
111114

@@ -119,7 +122,7 @@ describe('createOdpManager', () => {
119122
userAgentParser: {} as any,
120123
};
121124
const odpManager = createOdpManager(options);
122-
expect(odpManager).toBe(mockGetOdpManager.mock.results[0].value);
123-
expect(mockGetOdpManager).toHaveBeenNthCalledWith(1, expect.objectContaining(options));
125+
expect(odpManager).toBe(mockGetOpaqueOdpManager.mock.results[0].value);
126+
expect(mockGetOpaqueOdpManager).toHaveBeenNthCalledWith(1, expect.objectContaining(options));
124127
});
125128
});

0 commit comments

Comments
 (0)