UNPKG

@splitsoftware/splitio-commons

Version:
132 lines (131 loc) 7.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.splitApiFactory = void 0; var splitHttpClient_1 = require("./splitHttpClient"); var objectAssign_1 = require("../utils/lang/objectAssign"); var constants_1 = require("../utils/constants"); var constants_2 = require("../logger/constants"); var noCacheHeaderOptions = { headers: { 'Cache-Control': 'no-cache' } }; function userKeyToQueryParam(userKey) { return 'users=' + encodeURIComponent(userKey); // no need to check availability of `encodeURIComponent`, since it is a global highly supported. } /** * Factory of SplitApi objects, which group the collection of Split HTTP endpoints used by the SDK * * @param settings - validated settings object * @param platform - object containing environment-specific dependencies * @param telemetryTracker - telemetry tracker */ function splitApiFactory(settings, platform, telemetryTracker) { var urls = settings.urls; var filterQueryString = settings.sync.__splitFiltersValidation && settings.sync.__splitFiltersValidation.queryString; var SplitSDKImpressionsMode = settings.sync.impressionsMode; var splitHttpClient = (0, splitHttpClient_1.splitHttpClientFactory)(settings, platform); return { // @TODO throw errors if health check requests fail, to log them in the Synchronizer getSdkAPIHealthCheck: function () { var url = urls.sdk + "/version"; return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; }); }, getEventsAPIHealthCheck: function () { var url = urls.events + "/version"; return splitHttpClient(url).then(function () { return true; }).catch(function () { return false; }); }, fetchAuth: function (userMatchingKeys) { var url = urls.auth + "/v2/auth?s=" + settings.sync.flagSpecVersion; if (userMatchingKeys) { // `userMatchingKeys` is undefined in server-side var queryParams = userMatchingKeys.map(userKeyToQueryParam).join('&'); if (queryParams) url += '&' + queryParams; } return splitHttpClient(url, undefined, telemetryTracker.trackHttp(constants_1.TOKEN)); }, fetchSplitChanges: function (since, noCache, till, rbSince) { var url = urls.sdk + "/splitChanges?s=" + settings.sync.flagSpecVersion + "&since=" + since + (rbSince ? '&rbSince=' + rbSince : '') + (filterQueryString || '') + (till ? '&till=' + till : ''); return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SPLITS)) .catch(function (err) { if (err.statusCode === 414) settings.log.error(constants_2.ERROR_TOO_MANY_SETS); throw err; }); }, fetchSegmentChanges: function (since, segmentName, noCache, till) { var url = urls.sdk + "/segmentChanges/" + segmentName + "?since=" + since + (till ? '&till=' + till : ''); return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.SEGMENT)); }, fetchMemberships: function (userMatchingKey, noCache, till) { /** * URI encoding of user keys in order to: * - avoid 400 responses (due to URI malformed). E.g.: '/api/memberships/%' * - avoid 404 responses. E.g.: '/api/memberships/foo/bar' * - match user keys with special characters. E.g.: 'foo%bar', 'foo/bar' */ var url = urls.sdk + "/memberships/" + encodeURIComponent(userMatchingKey) + (till ? '?till=' + till : ''); return splitHttpClient(url, noCache ? noCacheHeaderOptions : undefined, telemetryTracker.trackHttp(constants_1.MEMBERSHIPS)); }, /** * Post events. * * @param body - Events bulk payload * @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers. */ postEventsBulk: function (body, headers) { var url = urls.events + "/events/bulk"; return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.EVENTS)); }, /** * Post impressions. * * @param body - Impressions bulk payload * @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers. */ postTestImpressionsBulk: function (body, headers) { var url = urls.events + "/testImpressions/bulk"; return splitHttpClient(url, { // Adding extra headers to send impressions in OPTIMIZED or DEBUG modes. method: 'POST', body: body, headers: (0, objectAssign_1.objectAssign)({ SplitSDKImpressionsMode: SplitSDKImpressionsMode }, headers) }, telemetryTracker.trackHttp(constants_1.IMPRESSIONS)); }, /** * Post impressions counts. * * @param body - Impressions counts payload * @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers. */ postTestImpressionsCount: function (body, headers) { var url = urls.events + "/testImpressions/count"; return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.IMPRESSIONS_COUNT)); }, /** * Post unique keys for client side. * * @param body - unique keys payload * @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers. */ postUniqueKeysBulkCs: function (body, headers) { var url = urls.telemetry + "/v1/keys/cs"; return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY)); }, /** * Post unique keys for server side. * * @param body - unique keys payload * @param headers - Optionals headers to overwrite default ones. For example, it is used in producer mode to overwrite metadata headers. */ postUniqueKeysBulkSs: function (body, headers) { var url = urls.telemetry + "/v1/keys/ss"; return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY)); }, postMetricsConfig: function (body, headers) { var url = urls.telemetry + "/v1/metrics/config"; return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY), true); }, postMetricsUsage: function (body, headers) { var url = urls.telemetry + "/v1/metrics/usage"; return splitHttpClient(url, { method: 'POST', body: body, headers: headers }, telemetryTracker.trackHttp(constants_1.TELEMETRY), true); } }; } exports.splitApiFactory = splitApiFactory;