salsify-experiences-sdk
Version:
SDK to be used by commerce websites to implement product experiences.
71 lines • 2.5 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const request_1 = __importDefault(require("../request"));
const timeout_1 = __importDefault(require("../timeout"));
const stagingBaseUrl = 'https://retail-client-events-service-staging.internal.salsify.com';
const stagingEventsEndpoint = `${stagingBaseUrl}/events`;
const prodBaseUrl = 'https://retail-client-events-service.internal.salsify.com';
const prodEventsEndpoint = `${prodBaseUrl}/events`;
const MAX_QUEUE_SIZE = 1000;
class LogTransport {
#context;
#settings;
#eventsEndpoint;
#queuedEvents = [];
#timeout;
constructor(context, settings) {
this.#context = context;
this.#settings = settings;
this.#eventsEndpoint = this.#settings.staging ? stagingEventsEndpoint : prodEventsEndpoint;
}
log(code, properties, context) {
const event = {
code: 'sdk_' + code,
properties,
context,
timestamp: Date.now() / 1000,
};
this.#send([event]);
}
async #send(logs) {
const allLogs = [...this.#queuedEvents.splice(0), ...logs];
if (!allLogs.length)
return;
const payload = {
app: 'sxp_sdk',
channel: this.#context.clientId,
csid: this.#context.sessionId,
pagesessionid: this.#context.pageSessionId,
jsSource: this.#context.jsSource,
timestamp: Date.now() / 1000,
logs: allLogs,
};
let response;
try {
response = await request_1.default.post(this.#eventsEndpoint, payload);
}
catch (e) {
this.#enqueueAndStartTimeout(allLogs);
return;
}
if (response.ok) {
this.#timeout?.clear();
}
else {
this.#enqueueAndStartTimeout(allLogs);
}
}
#enqueueAndStartTimeout(logs) {
if (this.#queuedEvents.length >= MAX_QUEUE_SIZE)
return;
this.#queuedEvents.push(...logs.splice(0, MAX_QUEUE_SIZE - this.#queuedEvents.length));
if (!this.#timeout)
this.#timeout = new timeout_1.default();
this.#timeout.start(() => this.#send(this.#queuedEvents.splice(0)));
}
}
exports.default = LogTransport;
//# sourceMappingURL=log-service-transport.js.map