@splitsoftware/splitio-commons
Version:
Split JavaScript SDK common components
48 lines (47 loc) • 2.12 kB
JavaScript
import { groupBy, forOwn } from '../../utils/lang';
import { submitterFactory } from './submitter';
import { SUBMITTERS_PUSH_FULL_QUEUE } from '../../logger/constants';
/**
* Converts `impressions` data from cache into request payload.
*/
export function fromImpressionsCollector(sendLabels, entityType, data) {
var groupedByFeature = groupBy(data, 'feature');
var dto = [];
forOwn(groupedByFeature, function (value, name) {
dto.push({
f: name,
i: value.map(function (entry) {
return {
k: entry.keyName,
t: entry.treatment,
m: entry.time,
c: entry.changeNumber,
r: sendLabels ? entry.label : undefined,
b: entry.bucketingKey,
pt: entry.pt,
properties: entry.properties,
et: entityType, // Definition type
};
})
});
});
return dto;
}
/**
* Submitter that periodically posts impressions data
*/
export function impressionsSubmitterFactory(params) {
var _a = params.settings, log = _a.log, impressionsRefreshRate = _a.scheduler.impressionsRefreshRate, labelsEnabled = _a.core.labelsEnabled, postTestImpressionsBulk = params.serviceApi.postTestImpressionsBulk, impressions = params.storage.impressions, entityType = params.entityType;
// retry impressions only once.
var 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(function () {
if (syncTask.isRunning()) {
log.info(SUBMITTERS_PUSH_FULL_QUEUE, [impressions.name]);
syncTask.execute();
}
// If submitter is stopped (e.g., user consent declined or unknown, or app state offline), we don't send the data.
// Data will be sent when submitter is resumed.
});
return syncTask;
}