Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,58 @@ it('produces results in order', async () => {
base.close();
});

it('includes basis parameter in stream URI when selectorGetter returns a value', () => {
const mockEventSource = createMockEventSource();
const mockRequests = createMockRequests(mockEventSource);

const base = createBase(mockRequests, logger, {
streamUriPath: '/sdk/stream/eval/ctx',
parameters: [{ key: 'auth', value: 'my-key' }],
selectorGetter: () => '(p:test:1)',
});
base.start();

const uri = mockRequests.createEventSource.mock.calls[0][0];
expect(uri).toContain(`basis=${encodeURIComponent('(p:test:1)')}`);
expect(uri).toContain('auth=my-key');

base.close();
});

it('does not include basis parameter when selectorGetter returns undefined', () => {
const mockEventSource = createMockEventSource();
const mockRequests = createMockRequests(mockEventSource);

const base = createBase(mockRequests, logger, {
streamUriPath: '/sdk/stream/eval/ctx',
parameters: [{ key: 'auth', value: 'my-key' }],
selectorGetter: () => undefined,
});
base.start();

const uri = mockRequests.createEventSource.mock.calls[0][0];
expect(uri).not.toContain('basis');
expect(uri).toContain('auth=my-key');

base.close();
});

it('does not include basis parameter when no selectorGetter is provided', () => {
const mockEventSource = createMockEventSource();
const mockRequests = createMockRequests(mockEventSource);

const base = createBase(mockRequests, logger, {
streamUriPath: '/sdk/stream/eval/ctx',
parameters: [{ key: 'auth', value: 'my-key' }],
});
base.start();

const uri = mockRequests.createEventSource.mock.calls[0][0];
expect(uri).not.toContain('basis');

base.close();
});

it('close is idempotent', () => {
const mockEventSource = createMockEventSource();
const mockRequests = createMockRequests(mockEventSource);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,15 @@ export function createBase(
pingHandler?: PingHandler;
streamUriPath?: string;
parameters?: { key: string; value: string }[];
selectorGetter?: () => string | undefined;
} = {},
) {
return createStreamingBase({
requests: mockRequests as any,
serviceEndpoints,
streamUriPath: options.streamUriPath ?? '/sdk/stream/eval/test-context',
parameters: options.parameters ?? [],
selectorGetter: options.selectorGetter,
headers: baseHeaders,
initialRetryDelayMillis: 1000,
logger,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ export function createStreamingBase(config: {
serviceEndpoints: ServiceEndpoints;
streamUriPath: string;
parameters: { key: string; value: string }[];
selectorGetter?: () => string | undefined;
headers: LDHeaders;
initialRetryDelayMillis: number;
logger?: LDLogger;
Expand All @@ -94,13 +95,17 @@ export function createStreamingBase(config: {
config.logger,
);

const streamUri = getStreamingUri(
config.serviceEndpoints,
config.streamUriPath,
config.parameters,
);
const headers: { [key: string]: string | string[] } = { ...config.headers };

function buildStreamUri(): string {
const params = [...config.parameters];
const basis = config.selectorGetter?.();
if (basis) {
params.push({ key: 'basis', value: encodeURIComponent(basis) });
}
return getStreamingUri(config.serviceEndpoints, config.streamUriPath, params);
}

let eventSource: EventSource | undefined;
let connectionAttemptStartTime: number | undefined;
let fdv1Fallback = false;
Expand Down Expand Up @@ -256,7 +261,7 @@ export function createStreamingBase(config: {

logConnectionAttempt();

const es = config.requests.createEventSource(streamUri, {
const es = config.requests.createEventSource(buildStreamUri(), {
headers,
errorFilter: (error: HttpErrorResponse) => handleError(error),
initialRetryDelayMillis: config.initialRetryDelayMillis,
Expand Down