UNPKG

@vtex/api

Version:
90 lines (89 loc) 3.56 kB
"use strict"; 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; }