@vtex/api
Version:
VTEX I/O API client
90 lines (89 loc) • 3.56 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Segment = void 0;
const cookie_1 = __importDefault(require("cookie"));
const ramda_1 = require("ramda");
const constants_1 = require("../../constants");
const HttpClient_1 = require("../../HttpClient");
const JanusClient_1 = require("./JanusClient");
const SEGMENT_COOKIE = 'vtex_segment';
const SEGMENT_MAX_AGE_S = 60 * 60; // 60 minutes - segment is actually immutable
const ALLOWED_QUERY_PREFIXES = ['utm', 'cultureInfo', 'supportedLocales', '__bindingId'];
const filterAndSortQuery = (query) => {
if (!query) {
return null;
}
const filteredKeys = Object.keys(query)
.filter((k) => !!k && ALLOWED_QUERY_PREFIXES.some((prefix) => k.startsWith(prefix)))
.sort();
return filteredKeys.reduce((acc, val) => {
acc[val] = query[val];
return acc;
}, {});
};
const routes = {
base: '/api/segments',
segments: (token) => (token ? `${routes.base}/${token}` : routes.base),
};
class Segment extends JanusClient_1.JanusClient {
constructor() {
super(...arguments);
/**
* Get the segment data using the current `ctx.vtex.segmentToken`
*
* @memberof Segment
*/
this.getSegment = (tracingConfig) => this.rawSegment(this.context.segmentToken, undefined, tracingConfig).then((0, ramda_1.prop)('data'));
/**
* Get the segment data from this specific segment token
*
* @memberof Segment
*/
this.getSegmentByToken = (token, tracingConfig) => this.rawSegment(token, undefined, tracingConfig).then((0, ramda_1.prop)('data'));
this.getOrCreateSegment = async (query, token, tracingConfig) => {
const { data: segmentData, headers } = await this.rawSegment(token, query, tracingConfig);
return {
segmentData,
segmentToken: extractSegmentCookie(headers),
};
};
this.rawSegment = (token, query, tracingConfig) => {
const { product, workspace } = this.context;
const filteredQuery = filterAndSortQuery(query);
const metric = token ? 'segment-get-token' : 'segment-get-new';
return this.http.getRaw(routes.segments(token), {
forceMaxAge: SEGMENT_MAX_AGE_S,
headers: {
'Content-Type': 'application/json',
[constants_1.PRODUCT_HEADER]: product || '',
},
inflightKey: HttpClient_1.inflightUrlWithQuery,
metric,
params: {
...filteredQuery,
session_path: product || '',
workspace,
},
tracing: {
requestSpanNameSuffix: metric,
...tracingConfig === null || tracingConfig === void 0 ? void 0 : tracingConfig.tracing,
},
});
};
}
}
exports.Segment = Segment;
function extractSegmentCookie(headers) {
var _a;
for (const setCookie of (_a = headers['set-cookie']) !== null && _a !== void 0 ? _a : []) {
const parsedCookie = cookie_1.default.parse(setCookie);
const segmentCookie = parsedCookie[SEGMENT_COOKIE];
if (segmentCookie != null) {
return segmentCookie;
}
}
return null;
}