UNPKG

@petbee/session-core

Version:

Petbee Session core tracking logic

68 lines (63 loc) 2.37 kB
var PetbeeSession = (function (exports) { 'use strict'; const getApiEndpoint = (env) => { switch (env) { case 'development': return 'https://api.dev.petbee.com.br/sessions/v1'; case 'staging': return 'https://api.dev.petbee.com.br/sessions/v1'; case 'production': return 'https://api.petbee.com.br/sessions/v1'; default: return 'https://api.dev.petbee.com.br/sessions/v1'; } }; let isInitialized = false; function resetInitialization() { isInitialized = false; } function init(options) { if (isInitialized) { console.warn('PetbeeSession: Already initialized.'); return; } isInitialized = true; const debounce = (func, delay) => { let timer; return (...args) => { clearTimeout(timer); timer = window.setTimeout(() => func(...args), delay); }; }; // eslint-disable-next-line max-params const retryFetch = (url, reqOptions, retries = 3, delay = 1000) => { return fetch(url, reqOptions).catch((error) => { if (retries > 0) { return new Promise((resolve) => setTimeout(resolve, delay)).then(() => retryFetch(url, reqOptions, retries - 1, delay * 2)); } throw error; }); }; const sendSession = debounce(() => { const sessionData = { referrer: window.location.href, originalReferrer: document.referrer || '', }; retryFetch(getApiEndpoint(options.env ?? 'development'), { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(sessionData), credentials: 'include', // Include cookies if needed }).catch((error) => { console.error('PetbeeSession: Failed to send session data after retries.', error); }); }, options.debounceDelay ?? 500); // Initial session send sendSession(); } exports.init = init; exports.resetInitialization = resetInitialization; return exports; })({});