Skip to content

Commit b1e0123

Browse files
committed
chore: revert datasource config and add custom datasource option
1 parent b02abe9 commit b1e0123

File tree

6 files changed

+114
-250
lines changed

6 files changed

+114
-250
lines changed

packages/shared/sdk-server/__tests__/data_sources/fileDataInitilizerFDv2.test.ts

Lines changed: 47 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import {
77
WatchHandle,
88
} from '@launchdarkly/js-sdk-common';
99

10+
import { FileSystemDataSourceConfiguration } from '../../src/api';
1011
import FileDataInitializerFDv2 from '../../src/data_sources/fileDataInitilizerFDv2';
11-
import Configuration from '../../src/options/Configuration';
1212
import { createBasicPlatform } from '../createBasicPlatform';
1313
import TestLogger, { LogLevel } from '../Logger';
1414

@@ -78,7 +78,6 @@ describe('FileDataInitializerFDv2', () => {
7878
let mockFilesystem: MockFilesystem;
7979
let logger: TestLogger;
8080
let platform: Platform;
81-
let config: Configuration;
8281
let mockDataCallback: jest.Mock;
8382
let mockStatusCallback: jest.Mock;
8483

@@ -100,24 +99,14 @@ describe('FileDataInitializerFDv2', () => {
10099
});
101100

102101
it('throws error when paths are not provided', () => {
103-
config = new Configuration({
104-
dataSystem: {
105-
dataSource: {
106-
dataSourceOptionsType: 'standard',
107-
initializerOptions: {
108-
file: {
109-
enabled: true,
110-
paths: [],
111-
},
112-
},
113-
},
114-
},
115-
logger,
116-
});
102+
const options: FileSystemDataSourceConfiguration = {
103+
type: 'file',
104+
paths: [],
105+
};
117106

118107
expect(() => {
119108
/* eslint-disable-next-line no-new */
120-
new FileDataInitializerFDv2(config, platform);
109+
new FileDataInitializerFDv2(options, platform, logger);
121110
}).toThrow('FileDataInitializerFDv2: paths are required');
122111
});
123112

@@ -127,46 +116,26 @@ describe('FileDataInitializerFDv2', () => {
127116
fileSystem: undefined,
128117
};
129118

130-
config = new Configuration({
131-
dataSystem: {
132-
dataSource: {
133-
dataSourceOptionsType: 'standard',
134-
initializerOptions: {
135-
file: {
136-
enabled: true,
137-
paths: ['test.json'],
138-
},
139-
},
140-
},
141-
},
142-
logger,
143-
});
119+
const options: FileSystemDataSourceConfiguration = {
120+
type: 'file',
121+
paths: ['test.json'],
122+
};
144123

145124
expect(() => {
146125
/* eslint-disable-next-line no-new */
147-
new FileDataInitializerFDv2(config, platformWithoutFileSystem);
126+
new FileDataInitializerFDv2(options, platformWithoutFileSystem, logger);
148127
}).toThrow('FileDataInitializerFDv2: file system is required');
149128
});
150129

151130
it('loads and processes JSON file with flags and segments', async () => {
152131
mockFilesystem.fileData['test.json'] = { timestamp: 0, data: allPropertiesJson };
153132

154-
config = new Configuration({
155-
dataSystem: {
156-
dataSource: {
157-
dataSourceOptionsType: 'standard',
158-
initializerOptions: {
159-
file: {
160-
enabled: true,
161-
paths: ['test.json'],
162-
},
163-
},
164-
},
165-
},
166-
logger,
167-
});
133+
const options: FileSystemDataSourceConfiguration = {
134+
type: 'file',
135+
paths: ['test.json'],
136+
};
168137

169-
const initializer = new FileDataInitializerFDv2(config, platform);
138+
const initializer = new FileDataInitializerFDv2(options, platform, logger);
170139
initializer.start(mockDataCallback, mockStatusCallback);
171140

172141
await jest.runAllTimersAsync();
@@ -179,22 +148,12 @@ describe('FileDataInitializerFDv2', () => {
179148
mockFilesystem.fileData['flags.json'] = { timestamp: 0, data: flagOnlyJson };
180149
mockFilesystem.fileData['segments.json'] = { timestamp: 0, data: segmentOnlyJson };
181150

182-
config = new Configuration({
183-
dataSystem: {
184-
dataSource: {
185-
dataSourceOptionsType: 'standard',
186-
initializerOptions: {
187-
file: {
188-
enabled: true,
189-
paths: ['flags.json', 'segments.json'],
190-
},
191-
},
192-
},
193-
},
194-
logger,
195-
});
151+
const options: FileSystemDataSourceConfiguration = {
152+
type: 'file',
153+
paths: ['flags.json', 'segments.json'],
154+
};
196155

197-
const initializer = new FileDataInitializerFDv2(config, platform);
156+
const initializer = new FileDataInitializerFDv2(options, platform, logger);
198157
initializer.start(mockDataCallback, mockStatusCallback);
199158

200159
await jest.runAllTimersAsync();
@@ -218,23 +177,13 @@ describe('FileDataInitializerFDv2', () => {
218177

219178
mockFilesystem.fileData['test.yaml'] = { timestamp: 0, data: yamlData };
220179

221-
config = new Configuration({
222-
dataSystem: {
223-
dataSource: {
224-
dataSourceOptionsType: 'standard',
225-
initializerOptions: {
226-
file: {
227-
enabled: true,
228-
paths: ['test.yaml'],
229-
yamlParser: mockYamlParser,
230-
},
231-
},
232-
},
233-
},
234-
logger,
235-
});
180+
const options: FileSystemDataSourceConfiguration = {
181+
type: 'file',
182+
paths: ['test.yaml'],
183+
yamlParser: mockYamlParser,
184+
};
236185

237-
const initializer = new FileDataInitializerFDv2(config, platform);
186+
const initializer = new FileDataInitializerFDv2(options, platform, logger);
238187
initializer.start(mockDataCallback, mockStatusCallback);
239188

240189
await jest.runAllTimersAsync();
@@ -248,22 +197,12 @@ describe('FileDataInitializerFDv2', () => {
248197
const yamlData = 'flags:\n flag1:\n key: flag1';
249198
mockFilesystem.fileData['test.yaml'] = { timestamp: 0, data: yamlData };
250199

251-
config = new Configuration({
252-
dataSystem: {
253-
dataSource: {
254-
dataSourceOptionsType: 'standard',
255-
initializerOptions: {
256-
file: {
257-
enabled: true,
258-
paths: ['test.yaml'],
259-
}
260-
},
261-
},
262-
},
263-
logger,
264-
});
200+
const options: FileSystemDataSourceConfiguration = {
201+
type: 'file',
202+
paths: ['test.yaml'],
203+
};
265204

266-
const initializer = new FileDataInitializerFDv2(config, platform);
205+
const initializer = new FileDataInitializerFDv2(options, platform, logger);
267206
initializer.start(mockDataCallback, mockStatusCallback);
268207

269208
await jest.runAllTimersAsync();
@@ -278,22 +217,12 @@ describe('FileDataInitializerFDv2', () => {
278217
it('handles invalid JSON gracefully', async () => {
279218
mockFilesystem.fileData['test.json'] = { timestamp: 0, data: 'invalid json {{{{' };
280219

281-
config = new Configuration({
282-
dataSystem: {
283-
dataSource: {
284-
dataSourceOptionsType: 'standard',
285-
initializerOptions: {
286-
file: {
287-
enabled: true,
288-
paths: ['test.json'],
289-
},
290-
},
291-
},
292-
},
293-
logger,
294-
});
220+
const options: FileSystemDataSourceConfiguration = {
221+
type: 'file',
222+
paths: ['test.json'],
223+
};
295224

296-
const initializer = new FileDataInitializerFDv2(config, platform);
225+
const initializer = new FileDataInitializerFDv2(options, platform, logger);
297226
initializer.start(mockDataCallback, mockStatusCallback);
298227

299228
await jest.runAllTimersAsync();
@@ -342,22 +271,12 @@ describe('FileDataInitializerFDv2', () => {
342271
mockFilesystem.fileData['flags.json'] = { timestamp: 0, data: flagFile };
343272
mockFilesystem.fileData['segments.json'] = { timestamp: 0, data: segmentFile };
344273

345-
config = new Configuration({
346-
dataSystem: {
347-
dataSource: {
348-
dataSourceOptionsType: 'standard',
349-
initializerOptions: {
350-
file: {
351-
enabled: true,
352-
paths: ['flags.json', 'segments.json'],
353-
}
354-
},
355-
},
356-
},
357-
logger,
358-
});
274+
const options: FileSystemDataSourceConfiguration = {
275+
type: 'file',
276+
paths: ['flags.json', 'segments.json'],
277+
};
359278

360-
const initializer = new FileDataInitializerFDv2(config, platform);
279+
const initializer = new FileDataInitializerFDv2(options, platform, logger);
361280
initializer.start(mockDataCallback, mockStatusCallback);
362281

363282
await jest.runAllTimersAsync();
@@ -429,22 +348,12 @@ describe('FileDataInitializerFDv2', () => {
429348
mockFilesystem.fileData['file1.json'] = { timestamp: 0, data: file1 };
430349
mockFilesystem.fileData['file2.json'] = { timestamp: 0, data: file2 };
431350

432-
config = new Configuration({
433-
dataSystem: {
434-
dataSource: {
435-
dataSourceOptionsType: 'standard',
436-
initializerOptions: {
437-
file: {
438-
enabled: true,
439-
paths: ['file1.json', 'file2.json'],
440-
},
441-
},
442-
},
443-
},
444-
logger,
445-
});
351+
const options: FileSystemDataSourceConfiguration = {
352+
type: 'file',
353+
paths: ['file1.json', 'file2.json'],
354+
};
446355

447-
const initializer = new FileDataInitializerFDv2(config, platform);
356+
const initializer = new FileDataInitializerFDv2(options, platform, logger);
448357
initializer.start(mockDataCallback, mockStatusCallback);
449358

450359
await jest.runAllTimersAsync();

packages/shared/sdk-server/src/LDClientImpl.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import { createPluginEnvironmentMetadata } from './createPluginEnvironmentMetada
4444
import { createPayloadListener } from './data_sources/createPayloadListenerFDv2';
4545
import { createStreamListeners } from './data_sources/createStreamListeners';
4646
import DataSourceUpdates from './data_sources/DataSourceUpdates';
47-
import FileDataInitializerFDv2 from './data_sources/fileDataInitilizerFDv2';
4847
import OneShotInitializerFDv2 from './data_sources/OneShotInitializerFDv2';
4948
import PollingProcessor from './data_sources/PollingProcessor';
5049
import PollingProcessorFDv2 from './data_sources/PollingProcessorFDv2';
@@ -324,10 +323,9 @@ function constructFDv2(
324323
if (!(config.offline || config.dataSystem!.useLdd)) {
325324
// make the FDv2 composite datasource with initializers/synchronizers
326325
const initializers: subsystem.LDDataSourceFactory[] = [];
327-
const initializerOptions = dataSystem.dataSource?.initializerOptions ?? {};
328326

329-
if (initializerOptions.polling?.enabled) {
330-
console.log('adding one shot initializer');
327+
// use one shot initializer for performance and cost if we can do a combination of polling and streaming
328+
if (isStandardOptions(dataSystem.dataSource)) {
331329
initializers.push(
332330
() =>
333331
new OneShotInitializerFDv2(
@@ -337,13 +335,6 @@ function constructFDv2(
337335
);
338336
}
339337

340-
// If a file intializer is configured, then we will add it as a fallback to the
341-
// polling initializer.
342-
if (initializerOptions.file?.enabled) {
343-
console.log('adding file data initializer');
344-
initializers.push(() => new FileDataInitializerFDv2(config, platform));
345-
}
346-
347338
const synchronizers: subsystem.LDDataSourceFactory[] = [];
348339
// if streaming is configured, add streaming synchronizer
349340
if (isStandardOptions(dataSystem.dataSource) || isStreamingOnlyOptions(dataSystem.dataSource)) {

0 commit comments

Comments
 (0)