Skip to content
Open
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
4 changes: 2 additions & 2 deletions src/listeners/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ export class BrowserSignalListener implements ISignalListener {
private serviceApi: ISplitApi;
private fromImpressionsCollector: (data: SplitIO.ImpressionDTO[]) => ImpressionsPayload;

constructor({ syncManager, settings, storage, splitApi }: ISdkFactoryContextSync) {
constructor({ syncManager, settings, storage, splitApi, entityType }: ISdkFactoryContextSync) {
this.syncManager = syncManager;
this.settings = settings;
this.storage = storage;
this.serviceApi = splitApi;
this.flushData = this.flushData.bind(this);
this.flushDataIfHidden = this.flushDataIfHidden.bind(this);
this.fromImpressionsCollector = fromImpressionsCollector.bind(undefined, settings.core.labelsEnabled);
this.fromImpressionsCollector = fromImpressionsCollector.bind(undefined, settings.core.labelsEnabled, entityType);
}

/**
Expand Down
6 changes: 5 additions & 1 deletion src/sdkFactory/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ export interface IPlatform {
SignalListener?: new (params: ISdkFactoryContext) => ISignalListener, // Used by BrowserSignalListener
}

// Definition type
export type EntityType = 'config' | 'flag';

export interface ISdkFactoryContext {
platform: IPlatform,
sdkReadinessManager: ISdkReadinessManager,
Expand All @@ -55,7 +58,8 @@ export interface ISdkFactoryContext {
splitApi?: ISplitApi,
syncManager?: ISyncManager,
clients: Record<string, SplitIO.IBasicClient>,
fallbackCalculator: IFallbackCalculator
fallbackCalculator: IFallbackCalculator,
entityType?: EntityType
}

export interface ISdkFactoryContextSync extends ISdkFactoryContext {
Expand Down
19 changes: 18 additions & 1 deletion src/sync/submitters/__tests__/impressionsSubmitter.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { impressionsSubmitterFactory } from '../impressionsSubmitter';
import { fromImpressionsCollector, impressionsSubmitterFactory } from '../impressionsSubmitter';
import { loggerMock } from '../../../logger/__tests__/sdkLogger.mock';
import { ImpressionsCacheInMemory } from '../../../storages/inMemory/ImpressionsCacheInMemory';

Expand Down Expand Up @@ -96,3 +96,20 @@ describe('Impressions submitter', () => {
});

});

describe('fromImpressionsCollector', () => {

test('includes entityType in payload when provided', () => {
const impressions = [imp1, imp2];
const result = fromImpressionsCollector(false, 'config', impressions);

expect(result).toEqual([{
f: 'someFeature',
i: [
{ k: 'k1', t: 'someTreatment', m: 0, c: 123, et: 'config' },
{ k: 'k2', t: 'someTreatment', m: 0, c: 123, et: 'config' },
]
}]);
});

});
18 changes: 9 additions & 9 deletions src/sync/submitters/impressionsSubmitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,30 @@ import SplitIO from '../../../types/splitio';
import { submitterFactory } from './submitter';
import { ImpressionsPayload } from './types';
import { SUBMITTERS_PUSH_FULL_QUEUE } from '../../logger/constants';
import { ISdkFactoryContextSync } from '../../sdkFactory/types';
import { EntityType, ISdkFactoryContextSync } from '../../sdkFactory/types';

/**
* Converts `impressions` data from cache into request payload.
*/
export function fromImpressionsCollector(sendLabels: boolean, data: SplitIO.ImpressionDTO[]): ImpressionsPayload {
export function fromImpressionsCollector(sendLabels: boolean, entityType: EntityType | undefined, data: SplitIO.ImpressionDTO[]): ImpressionsPayload {
let groupedByFeature = groupBy(data, 'feature');
let dto: ImpressionsPayload = [];

forOwn(groupedByFeature, (value, name) => {
dto.push({
f: name, // Test Name
f: name, // Definition type
i: value.map(entry => { // Key Impressions
const keyImpression = {
return {
k: entry.keyName, // Key
t: entry.treatment, // Treatment
m: entry.time, // Timestamp
c: entry.changeNumber, // ChangeNumber
r: sendLabels ? entry.label : undefined, // Rule
b: entry.bucketingKey, // Bucketing Key
pt: entry.pt, // Previous time
properties: entry.properties // Properties
properties: entry.properties, // Properties
et: entityType, // Definition type
};

return keyImpression;
})
});
});
Expand All @@ -43,11 +42,12 @@ export function impressionsSubmitterFactory(params: ISdkFactoryContextSync) {
const {
settings: { log, scheduler: { impressionsRefreshRate }, core: { labelsEnabled } },
splitApi: { postTestImpressionsBulk },
storage: { impressions }
storage: { impressions },
entityType
} = params;

// retry impressions only once.
const syncTask = submitterFactory(log, postTestImpressionsBulk, impressions, impressionsRefreshRate, fromImpressionsCollector.bind(undefined, labelsEnabled), 1);
const syncTask = submitterFactory(log, postTestImpressionsBulk, impressions, impressionsRefreshRate, fromImpressionsCollector.bind(undefined, labelsEnabled, entityType), 1);

// register impressions submitter to be executed when impressions cache is full
impressions.setOnFullQueueCb(() => {
Expand Down
3 changes: 3 additions & 0 deletions src/sync/submitters/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { IMetadata } from '../../dtos/types';
import SplitIO from '../../../types/splitio';
import { ISyncTask } from '../types';
import { EntityType } from '../../sdkFactory/types';

type ImpressionPayload = {
/** Matching Key */
Expand All @@ -20,6 +21,8 @@ type ImpressionPayload = {
pt?: number;
/** Stringified JSON object with properties */
properties?: string;
/** Definition type */
et?: EntityType,
};

export type ImpressionsPayload = {
Expand Down