Skip to content

Commit a1ca3b3

Browse files
authored
feat(events): Allow disabling event logging (#180)
1 parent c1b0e6f commit a1ca3b3

File tree

3 files changed

+53
-11
lines changed

3 files changed

+53
-11
lines changed

src/i-client-config.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,22 +159,24 @@ export interface IClientConfig extends IBaseRequestConfig {
159159

160160
/** Configuration settings for the event dispatcher */
161161
eventIngestionConfig?: {
162-
/** Number of milliseconds to wait between each batch delivery. Defaults to 10 seconds. */
163-
deliveryIntervalMs?: number;
164-
/** Minimum amount of milliseconds to wait before retrying a failed delivery. Defaults to 5 seconds */
165-
retryIntervalMs?: number;
166-
/** Maximum amount of milliseconds to wait before retrying a failed delivery. Defaults to 30 seconds. */
167-
maxRetryDelayMs?: number;
168-
/** Maximum number of retry attempts before giving up on a batch delivery. Defaults to 3 retries. */
169-
maxRetries?: number;
170162
/** Maximum number of events to send per delivery request. Defaults to 1000 events. */
171163
batchSize?: number;
164+
/** Number of milliseconds to wait between each batch delivery. Defaults to 10 seconds. */
165+
deliveryIntervalMs?: number;
166+
/** Whether to disable event ingestion. Defaults to false. */
167+
disabled?: boolean;
172168
/**
173169
* Maximum number of events to queue in memory before starting to drop events.
174170
* Note: This is only used if localStorage is not available.
175171
* Defaults to 10000 events.
176172
*/
177173
maxQueueSize?: number;
174+
/** Maximum number of retry attempts before giving up on a batch delivery. Defaults to 3 retries. */
175+
maxRetries?: number;
176+
/** Maximum amount of milliseconds to wait before retrying a failed delivery. Defaults to 30 seconds. */
177+
maxRetryDelayMs?: number;
178+
/** Minimum amount of milliseconds to wait before retrying a failed delivery. Defaults to 5 seconds */
179+
retryIntervalMs?: number;
178180
};
179181

180182
/**

src/index.spec.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
getPrecomputedInstance,
4141
IAssignmentLogger,
4242
init,
43+
NO_OP_EVENT_DISPATCHER,
4344
offlineInit,
4445
offlinePrecomputedInit,
4546
precomputedInit,
@@ -1756,4 +1757,32 @@ describe('enableOverrides', () => {
17561757
const assignment = client.getStringAssignment('test-flag', 'subject-1', {}, 'default-value');
17571758
expect(assignment).toBe('override-value');
17581759
});
1760+
1761+
describe('eventIngestionConfig', () => {
1762+
it('should not be used if eventIngestionConfig.disabled is true', async () => {
1763+
const client = await init({
1764+
apiKey,
1765+
baseUrl: `http://127.0.0.1`,
1766+
assignmentLogger: td.object<IAssignmentLogger>(),
1767+
forceReinitialize: true,
1768+
eventIngestionConfig: {
1769+
disabled: true,
1770+
},
1771+
});
1772+
expect(client['eventDispatcher']).toEqual(NO_OP_EVENT_DISPATCHER);
1773+
});
1774+
1775+
it('should be used if eventIngestionConfig.disabled is false', async () => {
1776+
const client = await init({
1777+
apiKey,
1778+
baseUrl: `http://127.0.0.1`,
1779+
assignmentLogger: td.object<IAssignmentLogger>(),
1780+
forceReinitialize: true,
1781+
eventIngestionConfig: {
1782+
disabled: false,
1783+
},
1784+
});
1785+
expect(client['eventDispatcher']).not.toEqual(NO_OP_EVENT_DISPATCHER);
1786+
});
1787+
});
17591788
});

src/index.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ const flagConfigurationStore = configurationStorageFactory({
9999
const memoryOnlyPrecomputedFlagsStore = precomputedFlagsStorageFactory();
100100
const memoryOnlyPrecomputedBanditsStore = precomputedBanditStoreFactory();
101101

102+
export const NO_OP_EVENT_DISPATCHER: EventDispatcher = {
103+
// eslint-disable-next-line @typescript-eslint/no-empty-function
104+
attachContext: () => {},
105+
// eslint-disable-next-line @typescript-eslint/no-empty-function
106+
dispatch: () => {},
107+
};
108+
102109
/**
103110
* Client for assigning experiment variations.
104111
* @public
@@ -983,11 +990,15 @@ function newEventDispatcher(
983990
const {
984991
batchSize = 1_000,
985992
deliveryIntervalMs = 10_000,
986-
retryIntervalMs = 5_000,
987-
maxRetryDelayMs = 30_000,
988-
maxRetries = 3,
993+
disabled = false,
989994
maxQueueSize = 10_000,
995+
maxRetries = 3,
996+
maxRetryDelayMs = 30_000,
997+
retryIntervalMs = 5_000,
990998
} = config;
999+
if (disabled) {
1000+
return NO_OP_EVENT_DISPATCHER;
1001+
}
9911002
const eventQueue = hasWindowLocalStorage()
9921003
? new LocalStorageBackedNamedEventQueue<Event>('events')
9931004
: new BoundedEventQueue<Event>('events', [], maxQueueSize);

0 commit comments

Comments
 (0)