@flagship.io/js-sdk
Version:
1,309 lines (1,276 loc) • 285 kB
JavaScript
import * as __WEBPACK_EXTERNAL_MODULE_events__ from "events";
/******/ var __webpack_modules__ = ({
/***/ 121:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ VisitorEvent: () => (/* binding */ VisitorEvent)
/* harmony export */ });
class VisitorEvent {
_customerAccountId;
_visitorId;
_currentUrl;
_clickPath;
_clickPosition;
_screenSize;
_scrollPosition;
get customerAccountId() {
return this._customerAccountId;
}
get visitorId() {
return this._visitorId;
}
get currentUrl() {
return this._currentUrl;
}
get clickPath() {
return this._clickPath;
}
get clickPosition() {
return this._clickPosition;
}
get screenSize() {
return this._screenSize;
}
get scrollPosition() {
return this._scrollPosition;
}
constructor({ customerAccountId, visitorId, currentUrl, clickPath, clickPosition, screenSize, scrollPosition }) {
this._customerAccountId = customerAccountId;
this._visitorId = visitorId;
this._currentUrl = currentUrl;
this._clickPath = clickPath;
this._clickPosition = clickPosition;
this._screenSize = screenSize;
this._scrollPosition = scrollPosition;
}
toApiKeys() {
const apiKeys = {
cid: this._customerAccountId,
vid: this._visitorId,
dl: this._currentUrl,
sr: this._screenSize,
t: 'VISITOREVENT'
};
if (this._clickPath) {
apiKeys.cp = this._clickPath;
}
if (this._clickPosition) {
apiKeys.cpo = this._clickPosition;
}
if (this._scrollPosition) {
apiKeys.sp = this._scrollPosition;
}
return apiKeys;
}
}
/***/ }),
/***/ 221:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ PageView: () => (/* binding */ PageView)
/* harmony export */ });
class PageView {
_customerAccountId;
_visitorId;
_hasAdBlocker;
_screenDepth;
_screenSize;
_doNotTrack;
_fonts;
_hasFakeBrowserInfos;
_hasFakeLanguageInfos;
_hasFakeOsInfos;
_hasFakeResolutionInfos;
_userLanguage;
_deviceCategory;
_pixelRatio;
_plugins;
_documentReferer;
_viewportSize;
_touchSupport;
_currentUrl;
_userAgent;
_customerUserId;
_timezoneOffset;
_eventCategory;
get customerAccountId() {
return this._customerAccountId;
}
get visitorId() {
return this._visitorId;
}
get hasAdBlocker() {
return this._hasAdBlocker;
}
get screenDepth() {
return this._screenDepth;
}
get screenSize() {
return this._screenSize;
}
get doNotTrack() {
return this._doNotTrack;
}
get fonts() {
return this._fonts;
}
get hasFakeBrowserInfos() {
return this._hasFakeBrowserInfos;
}
get hasFakeLanguageInfos() {
return this._hasFakeLanguageInfos;
}
get hasFakeOsInfos() {
return this._hasFakeOsInfos;
}
get hasFakeResolutionInfos() {
return this._hasFakeResolutionInfos;
}
get userLanguage() {
return this._userLanguage;
}
get deviceCategory() {
return this._deviceCategory;
}
get pixelRatio() {
return this._pixelRatio;
}
get plugins() {
return this._plugins;
}
get documentReferer() {
return this._documentReferer;
}
get viewportSize() {
return this._viewportSize;
}
get touchSupport() {
return this._touchSupport;
}
get currentUrl() {
return this._currentUrl;
}
get userAgent() {
return this._userAgent;
}
get customerUserId() {
return this._customerUserId;
}
get timezoneOffset() {
return this._timezoneOffset;
}
get eventCategory() {
return this._eventCategory;
}
constructor({ customerAccountId, visitorId, hasAdBlocker, screenDepth, screenSize, doNotTrack, fonts, hasFakeBrowserInfos, hasFakeLanguageInfos, hasFakeOsInfos, hasFakeResolutionInfos, userLanguage, deviceCategory, pixelRatio, plugins, documentReferer, viewportSize, touchSupport, currentUrl, userAgent, customerUserId, timezoneOffset, eventCategory }) {
this._customerAccountId = customerAccountId;
this._visitorId = visitorId;
this._hasAdBlocker = hasAdBlocker;
this._screenDepth = screenDepth;
this._screenSize = screenSize;
this._doNotTrack = doNotTrack;
this._fonts = fonts;
this._hasFakeBrowserInfos = hasFakeBrowserInfos;
this._hasFakeLanguageInfos = hasFakeLanguageInfos;
this._hasFakeOsInfos = hasFakeOsInfos;
this._hasFakeResolutionInfos = hasFakeResolutionInfos;
this._userLanguage = userLanguage;
this._deviceCategory = deviceCategory;
this._pixelRatio = pixelRatio;
this._plugins = plugins;
this._documentReferer = documentReferer;
this._viewportSize = viewportSize;
this._touchSupport = touchSupport;
this._currentUrl = currentUrl;
this._userAgent = userAgent;
this._customerUserId = customerUserId;
this._timezoneOffset = timezoneOffset;
this._eventCategory = eventCategory;
}
toApiKeys() {
const apiKeys = {
cid: this._customerAccountId,
vid: this._visitorId,
adb: this._hasAdBlocker,
sd: this._screenDepth,
sr: this._screenSize,
dnt: this._doNotTrack,
fnt: this._fonts,
hlb: this._hasFakeBrowserInfos,
hll: this._hasFakeLanguageInfos,
hlo: this._hasFakeOsInfos,
hlr: this._hasFakeResolutionInfos,
ul: this._userLanguage,
dc: this._deviceCategory,
pxr: this._pixelRatio,
dr: this._documentReferer,
vp: this._viewportSize,
tof: this._timezoneOffset,
tsp: this._touchSupport,
dl: this._currentUrl,
ua: this._userAgent,
ec: this._eventCategory,
t: 'PAGEVIEW'
};
if (this._plugins) {
apiKeys.plu = this._plugins;
}
if (this._customerUserId) {
apiKeys.cuid = this._customerUserId;
}
return apiKeys;
}
}
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
ABTastyWebSDKPostMessageType: () => (/* reexport */ ABTastyWebSDKPostMessageType),
APP_VERSION_CODE: () => (/* reexport */ APP_VERSION_CODE),
APP_VERSION_NAME: () => (/* reexport */ APP_VERSION_NAME),
CARRIER_NAME: () => (/* reexport */ CARRIER_NAME),
CacheStrategy: () => (/* reexport */ CacheStrategy),
DEVICE_LOCALE: () => (/* reexport */ DEVICE_LOCALE),
DEVICE_MODEL: () => (/* reexport */ DEVICE_MODEL),
DEVICE_TYPE: () => (/* reexport */ DEVICE_TYPE),
DecisionApiConfig: () => (/* reexport */ DecisionApiConfig),
DecisionMode: () => (/* reexport */ DecisionMode),
EventCategory: () => (/* reexport */ EventCategory),
FLAGSHIP_CLIENT: () => (/* reexport */ FLAGSHIP_CLIENT),
FLAGSHIP_CONTEXT: () => (/* reexport */ FLAGSHIP_CONTEXT),
FLAGSHIP_VERSION: () => (/* reexport */ FLAGSHIP_VERSION),
FLAGSHIP_VISITOR: () => (/* reexport */ FLAGSHIP_VISITOR),
FSFetchReasons: () => (/* reexport */ FSFetchReasons),
FSFetchStatus: () => (/* reexport */ FSFetchStatus),
FSFlag: () => (/* reexport */ FSFlag),
FSFlagCollection: () => (/* reexport */ FSFlagCollection),
FSFlagMetadata: () => (/* reexport */ FSFlagMetadata),
FSFlagStatus: () => (/* reexport */ FSFlagStatus),
FSSdkStatus: () => (/* reexport */ FSSdkStatus),
Flagship: () => (/* reexport */ Flagship),
HitType: () => (/* reexport */ HitType),
INTERFACE_NAME: () => (/* reexport */ INTERFACE_NAME),
INTERNET_CONNECTION: () => (/* reexport */ INTERNET_CONNECTION),
IP: () => (/* reexport */ IP),
LOCATION_CITY: () => (/* reexport */ LOCATION_CITY),
LOCATION_COUNTRY: () => (/* reexport */ LOCATION_COUNTRY),
LOCATION_LAT: () => (/* reexport */ LOCATION_LAT),
LOCATION_LONG: () => (/* reexport */ LOCATION_LONG),
LOCATION_REGION: () => (/* reexport */ LOCATION_REGION),
LogLevel: () => (/* reexport */ LogLevel),
OS_NAME: () => (/* reexport */ OS_NAME),
OS_VERSION_CODE: () => (/* reexport */ OS_VERSION_CODE),
OS_VERSION_NAME: () => (/* reexport */ OS_VERSION_NAME),
TroubleshootingLabel: () => (/* reexport */ TroubleshootingLabel),
Visitor: () => (/* reexport */ Visitor),
VisitorCacheStatus: () => (/* reexport */ VisitorCacheStatus),
"default": () => (/* binding */ src)
});
;// external "events"
var x = (y) => {
var x = {}; __webpack_require__.d(x, y); return x
}
var y = (x) => (() => (x))
const external_events_namespaceObject = x({ ["EventEmitter"]: () => (__WEBPACK_EXTERNAL_MODULE_events__.EventEmitter) });
;// ./src/sdkVersion.ts
// Generated by genversion.
const sdkVersion_version = '5.1.5';
;// ./src/enum/FlagshipConstant.ts
/**
* SDK language
*/
const SDK_INFO = {
name: 'TypeScript',
version: sdkVersion_version
};
/**
* Default request timeout in second
*/
const REQUEST_TIME_OUT = 2;
const FETCH_FLAG_BUFFERING_DEFAULT_TIME = 2;
const DEFAULT_DEDUPLICATION_TIME = 2.5;
const DEFAULT_POLLING_INTERVAL = 5;
const DEFAULT_SERVER_TIME_INTERVAL = 10;
const DEFAULT_SERVER_POOL_MAX_SIZE = 100;
const DEFAULT_BROWSER_TIME_INTERVAL = 5;
const DEFAULT_BROWSER_POOL_MAX_SIZE = 10;
const BATCH_MAX_SIZE = 2500000;
const ANALYTIC_HIT_ALLOCATION = 1;
const MAX_COLLECTING_TIME_MS = 30000;
const MAX_LAST_COLLECTING_TIME_MS = 120000;
const MAX_CLICK_PATH_LENGTH = 1900;
const MAX_SCORING_POLLING_TIME = 120000;
const SCROLL_END_DELAY_MS = 200;
const CLICK_PATH_DELAY_MS = 500;
const SCORING_INTERVAL = 5000;
/**
* Decision api base url
*/
const BASE_API_URL = 'https://decision.flagship.io/v2/';
const HIT_API_URL = 'https://ariane.abtasty.com';
const HIT_EVENT_URL = 'https://events.flagship.io';
const TROUBLESHOOTING_HIT_URL = 'https://events.flagship.io/troubleshooting';
const USAGE_HIT_URL = 'https://events.flagship.io/analytics';
const BUCKETING_API_URL = 'https://cdn.flagship.io/{0}/bucketing.json';
const BUCKETING_API_CONTEXT_URL = 'https://decision.flagship.io/v2/{0}/events';
const THIRD_PARTY_SEGMENT_URL = 'https://api-data-connector.flagship.io/accounts/{0}/segments/{1}';
const HIT_CONSENT_URL = 'https://ariane.abtasty.com';
const URL_CAMPAIGNS = '/campaigns';
const URL_ACTIVATE_MODIFICATION = 'activate';
const QA_ASSISTANT_PROD_URL = 'https://qa-assistant.flagship.io/bundle.js';
const QA_ASSISTANT_STAGING_URL = 'https://staging-qa-assistant.flagship.io/bundle.js';
const QA_ASSISTANT_LOCAL_URL = 'https://local-qa-assistant.flagship.io:5000/bundle.js';
const FS_QA_ASSISTANT = 'fs_qa_assistant';
const FS_QA_ASSISTANT_STAGING = 'fs_qa_assistant_staging';
const FS_QA_ASSISTANT_LOCAL = 'fs_qa_assistant_local';
const TAG_QA_ASSISTANT = 'abtasty_qa_assistant';
const TAG_QA_ASSISTANT_STAGING = 'abtasty_qa_assistant_staging';
const TAG_QA_ASSISTANT_LOCAL = 'abtasty_qa_assistant_local';
const TAG_QA_URL = 'qa-assistant.abtasty.com';
const FS_QA_URL = 'qa-assistant.flagship.io';
const EXPOSE_ALL_KEYS = 'exposeAllKeys';
const SEND_CONTEXT_EVENT = 'sendContextEvent';
const FS_CONSENT = 'fs_consent';
const FS_IS_QA_MODE_ENABLED = 'FS_IS_QA_MODE_ENABLED';
const FS_FORCED_VARIATIONS = 'FS_FORCED_VARIATIONS';
const FS_QA_ASSISTANT_SCRIPT_TAG_ID = 'FS_QA_ASSISTANT_SCRIPT_TAG_ID';
const EMOTION_AI_UC_URL = 'https://uc-info.flagship.io/v1/segments/clients/{0}/visitors/{1}';
const CDN_ACCOUNT_SETTINGS_URL = 'https://cdn.flagship.io/{0}/accountSettings.json';
const VISITOR_EAI_SCORE_KEY = '{0}_EAIScore';
const EMOTION_AI_EVENT_URL = 'https://events.flagship.io/emotionsai';
const SEND_EAI_EVENT = 'sendEAIEvent';
const SEND_EAI_EVENT_ERROR = 'Failed to send Emotion AI event: {0}';
const SEND_EAI_EVENT_SUCCESS = 'Emotion AI event sent: {0}';
const FETCH_EAI_SCORE = 'fetchEAIScore';
const FETCH_EAI_SCORE_ERROR = 'visitor {0}, Failed to fetch EAIScore: {1}';
const FETCH_EAI_SCORE_SUCCESS = 'visitor {0}, EAIScore fetched: {1}';
const EAI_SCORE_CONTEXT_KEY = 'eai::eas';
const CLIENT_CACHE_KEY = 'FS_CLIENT_VISITOR';
/**
* SDK version
*/
const SDK_VERSION = (/* unused pure expression or super */ null && (version));
const VISITOR_CACHE_VERSION = 1;
const HIT_CACHE_VERSION = 1;
const DEFAULT_HIT_CACHE_TIME_MS = 14400000;
const MAX_ACTIVATE_HIT_PER_BATCH = 100;
/**
* Message Info
*/
const SDK_STARTED_INFO = 'Flagship SDK (version: {0}) {1} in **{2}** mode';
const FLAGSHIP_SDK = 'Flagship SDK';
const EMIT_READY = 'ready';
const EMIT_STATUS = 'status';
const NO_BATCHING_WITH_CONTINUOUS_CACHING_STRATEGY = 3;
const JS_DOC_URL = 'https://docs.developers.flagship.io/docs/js-v3';
const PANIC_MODE_DOC_URL = 'https://docs.developers.flagship.io/docs/glossary#panic-mode';
/**
* Message Error
*/
const INITIALIZATION_PARAM_ERROR = `Params 'envId' and 'apiKey' must not be null or empty.
Learn more: ${JS_DOC_URL}#initialization`;
const ERROR = 'error';
const CONTEXT_NULL_ERROR = 'Context must not to be null';
const CONTEXT_PARAM_ERROR = "params {0} must be a non null String, and 'value' must be one of the following types , Number, Boolean";
const GET_MODIFICATION_CAST_ERROR = 'Modification for key {0} has a different type. Default value is returned.';
const GET_MODIFICATION_MISSING_ERROR = 'No modification for key {0}. Default value is returned.';
const GET_MODIFICATION_KEY_ERROR = 'Key {0} must not be null. Default value is returned.';
const ACTIVATE_MODIFICATION_KEY_ERROR = 'Key {0} must not be null, no activate will be sent.';
const GET_MODIFICATION_ERROR = 'No modification for key {0}.';
const GET_FLAG_ERROR = 'No flag for key {0}.';
const ACTIVATE_MODIFICATION_ERROR = 'No modification for key {0}, no activate will be sent.';
const DECISION_MANAGER_MISSING_ERROR = 'decisionManager must not be null.';
const TRACKER_MANAGER_MISSING_ERROR = 'trackerManager must not be null.';
const CURL_LIBRARY_IS_NOT_LOADED = 'curl library is not loaded';
const TYPE_ERROR = '{0} must be a {1}';
const TYPE_INTEGER_ERROR = 'value of {0} is not an {1}, it will be truncated to {1}';
const VISITOR_ID_ERROR = 'visitorId must not be null or empty';
const PANIC_MODE_ERROR = '{0} deactivated while panic mode is on.';
const METHOD_DEACTIVATED_CONSENT_ERROR = 'Method {0} is deactivated for visitor {1} : visitor did not consent.';
const METHOD_DEACTIVATED_ERROR = 'Visitor {0}, method {1} is deactivated while SDK status is: {2}.';
const METHOD_DEACTIVATED_SEND_CONSENT_ERROR = 'Send consent hit is deactivated while SDK status is: {1}.';
const TROUBLESHOOTING_HIT_ADDED_IN_QUEUE = 'The TROUBLESHOOTING HIT has been added to the pool queue : {0}';
const ANALYTICS_HIT_ADDED_IN_QUEUE = 'The USAGE HIT has been added to the pool queue : {0}';
const ACTIVATE_ADDED_IN_QUEUE = 'The ACTIVATE has been added to the pool queue : {0}';
const HIT_ADDED_IN_QUEUE = 'The HIT has been added into the pool queue : {0}';
const ADD_HIT = 'ADD HIT';
const ADD_TROUBLESHOOTING_HIT = 'ADD TROUBLESHOOTING HIT';
const ADD_USAGE_HIT = 'ADD USAGE HIT';
const ADD_ACTIVATE = 'ADD ACTIVATE';
const BATCH_SENT_SUCCESS = 'Batch hit has been sent : {0}';
const TROUBLESHOOTING_SENT_SUCCESS = 'Troubleshooting hit has been sent : {0}';
const ANALYTICS_HIT_SENT_SUCCESS = 'Usage hit has been sent : {0}';
const ACTIVATE_SENT_SUCCESS = 'Activate hit has been sent : {0}';
const SEND_BATCH = 'SEND BATCH';
const SEND_TROUBLESHOOTING = 'SEND TROUBLESHOOTING';
const SEND_USAGE_HIT = 'SEND USAGE HIT';
const SEND_ACTIVATE = 'SEND ACTIVATE';
const SEND_SEGMENT_HIT = 'SEND SEGMENT HIT';
const SEND_HIT = 'SEND HIT';
const EVENT_SUFFIX = 'events';
const FETCH_FLAGS_BUFFERING_MESSAGE = 'Visitor {0}, fetchFlags has been ignored and will continue to be ignored for the next {1}ms, this delay can be changed with `fetchFlagsBufferingTime` option in the SDK config';
const VISITOR_SYNC_FLAGS_MESSAGE = 'without calling `fetchFlags` method afterwards. So, the value of the flag `{1}` might be outdated';
const NEW_VISITOR_NOT_READY = `You can't create a new visitor without first calling the "Flagship.start" method.
Learn more: ${JS_DOC_URL}#initialization
`;
const LOOKUP_HITS_JSON_OBJECT_ERROR = 'JSON DATA must fit the type HitCacheDTO';
const ACTIVATE_BATCH_LENGTH = 5;
// Process
const PROCESS = 'process';
const PROCESS_INITIALIZATION = 'INITIALIZATION';
const PROCESS_UPDATE_CONTEXT = 'UPDATE CONTEXT';
const PROCESS_GET_MODIFICATION = 'GET MODIFICATION';
const PROCESS_GET_MODIFICATION_INFO = 'GET MODIFICATION INFO';
const PROCESS_NEW_VISITOR = 'NEW VISITOR';
const PROCESS_ACTIVE_MODIFICATION = 'ACTIVE MODIFICATION';
const PROCESS_SYNCHRONIZED_MODIFICATION = 'SYNCHRONIZED MODIFICATION';
const PROCESS_SEND_HIT = 'ADD HIT';
const PROCESS_SEND_ACTIVATE = 'SEND ACTIVATE';
const PROCESS_GET_CAMPAIGNS = 'GET CAMPAIGNS';
const PROCESS_GET_ALL_MODIFICATION = 'GET ALL MODIFICATIONS';
const PROCESS_MODIFICATIONS_FOR_CAMPAIGN = 'GET MODIFICATION FOR CAMPAIGN';
const PROCESS_CACHE_HIT = 'CACHE HIT';
const PROCESS_FLUSH_HIT = 'FLUSH HIT';
const PROCESS_LOOKUP_HIT = 'LOOKUP HIT';
// Api items
const BATCH = 'batch';
const CUSTOMER_ENV_ID_API_ITEM = 'cid';
const CUSTOMER_ENV_ID_API_ACTIVATE = 'cid';
const CUSTOMER_UID = 'cuid';
const ANONYMOUS_ID = 'aid';
const VISITOR_ID_API_ITEM = 'vid';
const VARIATION_GROUP_ID_API_ITEM = 'caid';
const VARIATION_GROUP_ID_API_ITEM_ACTIVATE = 'caid';
const VISITOR_CONSENT = 'vc';
const CAMPAIGN_ID = 'caid';
const VARIATION_ID_API_ITEM = 'vaid';
const DS_API_ITEM = 'ds';
const T_API_ITEM = 't';
const QT_API_ITEM = 'qt';
const QA_MODE_API_ITEM = 'qa';
const DL_API_ITEM = 'dl';
const SL_ITEM = 'sl';
const SDK_APP = 'APP';
const TID_API_ITEM = 'tid';
const TA_API_ITEM = 'ta';
const TT_API_ITEM = 'tt';
const TC_API_ITEM = 'tc';
const TCC_API_ITEM = 'tcc';
const ICN_API_ITEM = 'icn';
const SM_API_ITEM = 'sm';
const PM_API_ITEM = 'pm';
const TR_API_ITEM = 'tr';
const TS_API_ITEM = 'ts';
const IN_API_ITEM = 'in';
const IC_API_ITEM = 'ic';
const IP_API_ITEM = 'ip';
const IQ_API_ITEM = 'iq';
const IV_API_ITEM = 'iv';
const S_API_ITEM = 's';
const EVENT_CATEGORY_API_ITEM = 'ec';
const EVENT_ACTION_API_ITEM = 'ea';
const EVENT_LABEL_API_ITEM = 'el';
const EVENT_VALUE_API_ITEM = 'ev';
const USER_IP_API_ITEM = 'uip';
const SCREEN_RESOLUTION_API_ITEM = 'sr';
const USER_LANGUAGE = 'ul';
const SESSION_NUMBER = 'sn';
const HEADER_X_API_KEY = 'x-api-key';
const HEADER_X_ENV_ID = 'x-env-id';
const HEADER_CONTENT_TYPE = 'Content-Type';
const HEADER_X_SDK_CLIENT = 'x-sdk-client';
const HEADER_X_SDK_VERSION = 'x-sdk-version';
const HEADER_APPLICATION_JSON = 'application/json';
// Log
const INITIALIZATION_STARTING = 'Flagship SDK version {0} is starting in {1} mode with config {2}';
const BUCKETING_POOLING_STARTED = 'Bucketing polling process has been started';
const BUCKETING_POOLING_STOPPED = 'Bucketing polling process has been stopped';
const PROCESS_BUCKETING = 'BUCKETING';
const POLLING_EVENT_200 = 'Polling event with code status 200 : {0}';
const POLLING_EVENT_300 = 'Polling event with code status 304';
const POLLING_EVENT_FAILED = 'Polling event failed with error';
const PROCESS_SDK_STATUS = 'SDK STATUS';
const SDK_STATUS_CHANGED = 'SDK status has changed: {0}';
const SAVE_VISITOR_INSTANCE = 'Visitor {0} has been saved in SDK instance';
const VISITOR_CREATED = 'Visitor {0} has been created with context {1}, isAuthenticated:{2} and hasConsented {3}';
const VISITOR_PROFILE_LOADED = 'Visitor profile has been loaded {0}';
const VISITOR_ID_FROM_AB_TASTY_TAG = "The visitor ID '{0}' has been retrieved from ABTasty tag";
const VISITOR_ID_GENERATED = 'Visitor identifier is empty. A UUID {0} has been generated.';
const PREDEFINED_CONTEXT_LOADED = 'Predefined Context have been loaded {0}';
const CONTEXT_KEY_ERROR = `Visitor {0}, the key '{1}' must be a non null String.
Learn more: ${JS_DOC_URL}#updating-the-visitor-context`;
const CONTEXT_VALUE_ERROR = `Visitor {0}, 'value' for key '{1}[], must be one of the following types : String, Number, Boolean
Learn more: ${JS_DOC_URL}#updating-the-visitor-context`;
const PREDEFINED_CONTEXT_TYPE_ERROR = `visitor {0}, Predefined Context {0} must be of type {1}
Learn more: ${JS_DOC_URL}#predefined-user-context-keys-`;
const CONTEXT_KEY_VALUE_UPDATE = 'visitor `{0}`, context have been updated: key {1}, value {2}, Context {3}';
const CONTEXT_OBJET_PARAM_UPDATE = 'visitor `{0}`, context have been updated: key/value {1}, Context {2}';
const CLEAR_CONTEXT = 'visitor `{0}`, context has been cleared cleared `{1}`';
const PROCESS_CLEAR_CONTEXT = 'CLEAR_CONTEXT';
const CONSENT_CHANGED = 'Visitor `{0}` consent has been changed : {1}';
const PROCESS_SET_CONSENT = 'SET_CONSENT';
const FETCH_CAMPAIGNS_SUCCESS = 'Visitor {0}, anonymousId {1} with context {2} has just fetched campaigns {3} in {4} ms';
const FETCH_CAMPAIGNS_FROM_CACHE = 'Visitor {0}, anonymousId {1} with context {2} has just fetched campaigns from cache {3} in {4} ms';
const FETCH_FLAGS_FROM_CAMPAIGNS = 'Visitor {0}, anonymousId {1} with context {2} has just fetched flags {3} from Campaigns';
const FETCH_FLAGS_STARTED = 'visitor `{0}` fetchFlags process is started';
const FETCH_FLAGS_PANIC_MODE = 'Panic mode is enabled : all feature are disabled except fetchFlags.';
const PROCESS_FETCHING_FLAGS = 'FETCH_FLAGS';
const GET_FLAG_MISSING_ERROR = 'For the visitor "{0}", no flags were found with the key "{1}". Therefore, the default value "{2}" has been returned.';
const GET_FLAG_NOT_FOUND = 'For the visitor "{0}", no flags were found with the key "{1}". Therefore, an empty flag has been returned.';
const FETCH_FLAGS_MISSING = 'Visitor {0} has {1} without calling fetchFlags method, ';
const FLAG_VALUE = 'FLAG_VALUE';
const GET_FLAG = 'GET_FLAG';
const GET_FLAG_CAST_ERROR = 'For the visitor "{0}", the flag with key "{1}" has a different type compared to the default value. Therefore, the default value "{2}" has been returned.';
const GET_FLAG_VALUE = 'Visitor {0}, Flag for key {1} returns value {2}';
const USER_EXPOSED_FLAG_ERROR = 'For the visitor "{0}", no flags were found with the key "{1}". As a result, user exposure will not be sent.';
const VISITOR_EXPOSED_VALUE_NOT_CALLED = 'For the visitor `{0}`,assuming the getValue() method has not previously been invoked for the flag `{0}`. Therefore, the exposure is canceled';
const FLAG_VISITOR_EXPOSED = 'FLAG_VISITOR_EXPOSED';
const USER_EXPOSED_CAST_ERROR = 'For the visitor `{0}, the flag with the key `{0}` has a different type compared to the default value. Therefore, the exposure is interrupted';
const GET_METADATA_CAST_ERROR = 'Visitor {0}, Flag for key {1} has a different type with default value: Empty metadata object is returned {2}';
const FLAG_METADATA = 'FLAG_METADATA';
const NO_FLAG_METADATA = 'Visitor {0}, No Flags found for key {1}: Empty metadata object is returned';
const METADATA_SDK_NOT_READY = `Visitor {0}, Flag for key {1} Method Flag.metadata is deactivated while SDK status is NOT_READY: Empty metadata object is returned {2}
Learn more: ${JS_DOC_URL}#getting-flags-campaigns-metadata`;
const METADATA_PANIC_MODE = `Visitor {0}, Flag for key {1} Method Flag.metadata is deactivated while SDK status is PANIC: Empty metadata object is returned {2}
Learn more: ${PANIC_MODE_DOC_URL}`;
const AUTHENTICATE = 'AUTHENTICATE';
const VISITOR_AUTHENTICATE = 'The visitor is authenticated with new visitor ID {0} anonymous ID {1}';
const VISITOR_ALREADY_AUTHENTICATE = 'The visitor is already authenticated with visitor ID {0}';
const METHOD_DEACTIVATED_BUCKETING_ERROR = 'Visitor {0}, Method {1} is deactivated on Bucketing mode';
const VISITOR_AUTHENTICATE_VISITOR_ID_ERROR = `Visitor {0}, visitorId must not be null or empty
Learn more: ${JS_DOC_URL}#authenticate`;
const VISITOR_UNAUTHENTICATE = 'The visitor is unauthenticated with visitor ID {0}';
const UNAUTHENTICATE = 'UNAUTHENTICATE';
const FLAGSHIP_VISITOR_NOT_AUTHENTICATE = 'Visitor {0} is not authenticated yet';
const ALLOCATION = 'ALLOCATION';
const BUCKETING_VARIATION_CACHE = 'Visitor {0}, Variation {1} selected from cache.';
const BUCKETING_NEW_ALLOCATION = 'Visitor {0}, Variation {1} selected with allocation {2}.';
const LOOKUP_VISITOR_JSON_OBJECT_ERROR = `lookupVisitor method has loaded a bad format version ({0}) for visitor {1}.
Learn more: ${JS_DOC_URL}#managing-visitor-cache`;
const PROCESS_CACHE = 'CACHE';
const VISITOR_CACHE_ERROR = 'visitor {0}. {1} threw an exception {2}';
const HIT_CACHE_ERROR = '{0} threw an exception {1}';
const VISITOR_CACHE_LOADED = 'Visitor {0}, visitor cache has been loaded from database: {1}';
const VISITOR_CACHE_SAVED = 'Visitor {0}, visitor cache has been saved into database : {0}';
const VISITOR_CACHE_FLUSHED = 'Visitor {0}, visitor cache has been flushed from database.';
const HIT_CACHE_LOADED = 'Hits cache has been loaded from database: {0}';
const HIT_CACHE_SAVED = 'Hit cache has been saved into database : {0}';
const HIT_DATA_FLUSHED = 'The following hit keys have been flushed from database : {0}';
const ALL_HITS_FLUSHED = 'All hits cache has been flushed from database';
const BATCH_LOOP_STARTED = 'The Batch Loop has been started with a time interval of {0} ms';
const TRACKING_MANAGER = 'TRACKING_MANAGER';
const BATCH_LOOP_STOPPED = 'The Batch Loop has been stopped';
const TRACKING_MANAGER_ERROR = '{0} Unexpected Error occurred {1}';
const HIT_SENT_SUCCESS = '{0} has been sent : {1}';
const ACTIVATE_HIT = 'ACTIVATE HIT';
const BATCH_HIT = 'BATCH HIT';
const DIRECT_HIT = 'HIT';
const GET_THIRD_PARTY_SEGMENT = 'GET_THIRD_PARTY_SEGMENT';
const CONSENT_NOT_SPECIFY_WARNING = 'Consent has not been specified. By default, consent is set to false, which may result in some features being deactivated.';
const ACTION_TRACKING = 'Action Tracking';
const ACTION_TRACKING_HIT_RECEIVED = 'Hit received: {0}';
const ACTION_TRACKING_INVALID_HIT = 'Invalid hit data: {0}';
const ACTION_TRACKING_INVALID_NONCE = 'Invalid nonce: {0}';
const ACTION_TRACKING_SENDING_HIT = 'Sending hit: {0}';
const ACTION_TRACKING_SENDING_HIT_ERROR = 'Failed to send hit: {0}';
const ACTION_TRACKING_DISPATCHED = 'action tracking hits have been dispatched {0}';
const TRUSTED_QA_ORIGINS = (/* unused pure expression or super */ null && ([
'https://local-qa-assistant.abtasty.com:5000',
'https://staging-qa-assistant.abtasty.com',
'https://qa-assistant.abtasty.com',
'https://qa-assistant.flagship.io',
'https://local-qa-assistant.flagship.io:5000',
'https://staging-qa-assistant.flagship.io'
]));
;// ./src/visitor/Visitor.ts
/**
* The `Visitor` class represents a unique user within your application. It aids in
* managing the visitor's data and fetching the corresponding flags for the visitor
* from the [Flagship platform](https://app.flagship.io/login) .
*/
class Visitor extends external_events_namespaceObject.EventEmitter {
visitorDelegate;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
_onReady;
constructor(visitorDelegate) {
super();
this.visitorDelegate = visitorDelegate;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
this._onReady = (err) => {
this.emit(EMIT_READY, err);
};
this.visitorDelegate.on(EMIT_READY, this._onReady);
const instance = this;
instance.sendEaiVisitorEvent = (event) => {
this.visitorDelegate.sendEaiVisitorEvent(event);
};
instance.sendEaiPageView = (pageView) => {
this.visitorDelegate.sendEaiPageView(pageView);
};
instance.onEAICollectStatusChange = (callback) => {
this.visitorDelegate.onEAICollectStatusChange(callback);
};
}
/**
* @inheritdoc
*/
get visitorId() {
return this.visitorDelegate.visitorId;
}
/**
* @inheritdoc
*/
set visitorId(v) {
this.visitorDelegate.visitorId = v;
}
/**
* @inheritdoc
*/
get anonymousId() {
return this.visitorDelegate.anonymousId;
}
/**
* @inheritdoc
*/
get config() {
return this.visitorDelegate.config;
}
/**
* @inheritdoc
*/
get context() {
return this.visitorDelegate.context;
}
/**
* @inheritdoc
*/
get flagsStatus() {
return this.visitorDelegate.flagsStatus;
}
/**
* @inheritdoc
*/
get hasConsented() {
return this.visitorDelegate.hasConsented;
}
/**
* @inheritdoc
*/
setConsent(hasConsented) {
this.visitorDelegate.setConsent(hasConsented);
}
updateContext(context, value) {
this.visitorDelegate.updateContext(context, value);
}
/**
* @inheritdoc
*/
clearContext() {
this.visitorDelegate.clearContext();
}
/**
* @inheritdoc
*/
getFlag(key) {
return this.visitorDelegate.getFlag(key);
}
/**
* @inheritdoc
*/
getFlags() {
return this.visitorDelegate.getFlags();
}
/**
* @inheritdoc
*/
fetchFlags() {
return this.visitorDelegate.fetchFlags();
}
sendHit(hit) {
return this.visitorDelegate.sendHit(hit);
}
sendHits(hits) {
return this.visitorDelegate.sendHits(hits);
}
/**
* @inheritdoc
*/
authenticate(visitorId) {
this.visitorDelegate.authenticate(visitorId);
}
/**
* @inheritdoc
*/
unauthenticate() {
this.visitorDelegate.unauthenticate();
}
/**
* @inheritdoc
*/
collectEAIEventsAsync(...args) {
let currentPage;
if (args.length > 0) {
currentPage = args[0];
}
return this.visitorDelegate.collectEAIEventsAsync(currentPage);
}
/**
* @inheritdoc
*/
cleanup() {
this.visitorDelegate.cleanup();
this.visitorDelegate.off(EMIT_READY, this._onReady);
}
}
;// ./src/enum/FSSdkStatus.ts
/**
* Enum representing the status of the Flagship SDK.
*/
var FSSdkStatus;
(function (FSSdkStatus) {
/**
* It is the default initial status. This status remains until the sdk has been initialized successfully.
*/
FSSdkStatus[FSSdkStatus["SDK_NOT_INITIALIZED"] = 0] = "SDK_NOT_INITIALIZED";
/**
* The SDK is currently initializing.
*/
FSSdkStatus[FSSdkStatus["SDK_INITIALIZING"] = 1] = "SDK_INITIALIZING";
/**
* Flagship SDK is ready but is running in Panic mode: All features are disabled except the one which refresh this status.
*/
FSSdkStatus[FSSdkStatus["SDK_PANIC"] = 2] = "SDK_PANIC";
/**
* The Initialization is done, and Flagship SDK is ready to use.
*/
FSSdkStatus[FSSdkStatus["SDK_INITIALIZED"] = 3] = "SDK_INITIALIZED";
})(FSSdkStatus || (FSSdkStatus = {}));
;// ./src/config/DecisionMode.ts
var DecisionMode;
(function (DecisionMode) {
/**
* /**
* Flagship SDK mode decision api
*/
DecisionMode["DECISION_API"] = "DECISION-API";
/**
* Flagship SDK mode bucketing
*/
DecisionMode["BUCKETING"] = "BUCKETING";
DecisionMode["BUCKETING_EDGE"] = "BUCKETING_EDGE";
})(DecisionMode || (DecisionMode = {}));
;// ./src/enum/LogLevel.ts
var LogLevel;
(function (LogLevel) {
/**
* NONE = 0: Logging will be disabled.
*/
LogLevel[LogLevel["NONE"] = 0] = "NONE";
/**
* EMERGENCY = 1: Only emergencies will be logged.
*/
LogLevel[LogLevel["EMERGENCY"] = 1] = "EMERGENCY";
/**
* ALERT = 2: Only alerts and above will be logged.
*/
LogLevel[LogLevel["ALERT"] = 2] = "ALERT";
/**
* CRITICAL = 3: Only critical and above will be logged.
*/
LogLevel[LogLevel["CRITICAL"] = 3] = "CRITICAL";
/**
* ERROR = 4: Only errors and above will be logged.
*/
LogLevel[LogLevel["ERROR"] = 4] = "ERROR";
/**
* WARNING = 5: Only warnings and above will be logged.
*/
LogLevel[LogLevel["WARNING"] = 5] = "WARNING";
/**
* NOTICE = 6: Only notices and above will be logged.
*/
LogLevel[LogLevel["NOTICE"] = 6] = "NOTICE";
/**
* INFO = 7: Only info logs and above will be logged.
*/
LogLevel[LogLevel["INFO"] = 7] = "INFO";
/**
* DEBUG = 8: Only debug logs and above will be logged.
*/
LogLevel[LogLevel["DEBUG"] = 8] = "DEBUG";
/**
* ALL = 9: All logs will be logged.
*/
LogLevel[LogLevel["ALL"] = 9] = "ALL";
})(LogLevel || (LogLevel = {}));
;// ./src/enum/FSFetchReasons.ts
/**
* Enum representing the reasons for fetching Flags.
*/
var FSFetchReasons;
(function (FSFetchReasons) {
/**
* Indicates that a context has been updated or changed.
*/
FSFetchReasons["UPDATE_CONTEXT"] = "UPDATE_CONTEXT";
/**
* Indicates that the XPC method 'authenticate' has been called.
*/
FSFetchReasons["AUTHENTICATE"] = "AUTHENTICATE";
/**
* Indicates that the XPC method 'unauthenticate' has been called.
*/
FSFetchReasons["UNAUTHENTICATE"] = "UNAUTHENTICATE";
/**
* Indicates that fetching flags has failed.
*/
FSFetchReasons["FLAGS_FETCHING_ERROR"] = "FLAGS_FETCHING_ERROR";
/**
* Indicates that flags have been fetched from the cache.
*/
FSFetchReasons["FLAGS_FETCHED_FROM_CACHE"] = "FLAGS_FETCHED_FROM_CACHE";
/**
* Indicates that the visitor has been created.
*/
FSFetchReasons["FLAGS_NEVER_FETCHED"] = "FLAGS_NEVER_FETCHED";
/**
* Indicates that there is no specific reason for fetching flags.
*/
FSFetchReasons["NONE"] = "NONE";
})(FSFetchReasons || (FSFetchReasons = {}));
;// ./src/utils/utils.ts
/**
* Return a formatted string
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function sprintf(format, ...value) {
let formatted = format;
for (let i = 0; i < value.length; i++) {
const item = value[i];
const element = typeof item === 'string' ? item : JSON.stringify(item instanceof Map ? Array.from(item.values()) : item);
formatted = formatted.replace(new RegExp(`\\{${i}\\}`, 'g'), element);
}
return formatted;
}
function logErrorSprintf(config, tag, message, ...arg) {
if (!config || !config.logLevel || config.logLevel < LogLevel.ERROR) {
return;
}
const customMessage = sprintf(message, ...arg);
logError(config, customMessage, tag);
}
function logError(config, message, tag) {
if (!config || !config.logLevel || config.logLevel < LogLevel.ERROR) {
return;
}
if (typeof config.onLog === 'function') {
config.onLog(LogLevel.ERROR, tag, message);
}
if (config.logManager && typeof config.logManager.error === 'function') {
config.logManager.error(message, tag);
}
}
function logWarningSprintf(config, tag, message, ...arg) {
if (!config || !config.logLevel || config.logLevel < LogLevel.WARNING) {
return;
}
const customMessage = sprintf(message, ...arg);
logWarning(config, customMessage, tag);
}
function logWarning(config, message, tag) {
if (!config || !config.logLevel || config.logLevel < LogLevel.WARNING) {
return;
}
if (typeof config.onLog === 'function') {
config.onLog(LogLevel.WARNING, tag, message);
}
if (config.logManager && typeof config.logManager.warning === 'function') {
config.logManager.warning(message, tag);
}
}
function logInfoSprintf(config, tag, message, ...arg) {
if (!config || !config.logLevel || config.logLevel < LogLevel.INFO) {
return;
}
const customMessage = sprintf(message, ...arg);
logInfo(config, customMessage, tag);
}
function logInfo(config, message, tag) {
if (!config || !config.logLevel || config.logLevel < LogLevel.INFO) {
return;
}
if (typeof config.onLog === 'function') {
config.onLog(LogLevel.INFO, tag, message);
}
if (config.logManager && typeof config.logManager.info === 'function') {
config.logManager.info(message, tag);
}
}
function logDebugSprintf(config, tag, message, ...arg) {
if (!config || !config.logLevel || config.logLevel < LogLevel.DEBUG) {
return;
}
const customMessage = sprintf(message, ...arg);
logDebug(config, customMessage, tag);
}
function logDebug(config, message, tag) {
if (!config || !config.logLevel || config.logLevel < LogLevel.DEBUG) {
return;
}
if (typeof config.onLog === 'function') {
config.onLog(LogLevel.DEBUG, tag, message);
}
if (config.logManager && typeof config.logManager.debug === 'function') {
config.logManager.debug(message, tag);
}
}
function isBrowser() {
return typeof window !== 'undefined' && typeof window.document !== 'undefined';
}
function hasSameType(flagValue, defaultValue) {
if (typeof flagValue !== typeof defaultValue) {
return false;
}
if (typeof flagValue === 'object' && typeof defaultValue === 'object' &&
Array.isArray(flagValue) !== Array.isArray(defaultValue)) {
return false;
}
return true;
}
function uuidV4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (char) {
const rand = Math.random() * 16 | 0;
const value = char === 'x' ? rand : (rand & 0x3 | 0x8);
return value.toString(16);
});
}
function errorFormat(message, errorData) {
return JSON.stringify({
message,
data: errorData
});
}
function visitorFlagSyncStatusMessage(reason) {
let message = '';
switch (reason) {
case FSFetchReasons.FLAGS_NEVER_FETCHED:
message = `Visitor \`{0}\` has been created ${VISITOR_SYNC_FLAGS_MESSAGE}`;
break;
case FSFetchReasons.UPDATE_CONTEXT:
message = `Visitor context for visitor \`{0}\` has been updated ${VISITOR_SYNC_FLAGS_MESSAGE}`;
break;
case FSFetchReasons.AUTHENTICATE:
message = `Visitor \`{0}\` has been authenticated ${VISITOR_SYNC_FLAGS_MESSAGE}`;
break;
case FSFetchReasons.UNAUTHENTICATE:
message = `Visitor \`{0}\` has been unauthenticated ${VISITOR_SYNC_FLAGS_MESSAGE}`;
break;
case FSFetchReasons.FLAGS_FETCHING_ERROR:
message = 'There was an error while fetching flags for visitor `{0}`. So the value of the flag `{1}` may be outdated"';
break;
case FSFetchReasons.FLAGS_FETCHED_FROM_CACHE:
message = 'Flags for visitor `{0}` have been fetched from cache';
break;
default:
break;
}
return message;
}
function valueToHex(value) {
const jsonString = JSON.stringify(value);
const hex = Array.from(jsonString, char => char.charCodeAt(0).toString(16)).join('');
return hex;
}
function hexToValue(hex, config) {
if (typeof hex !== 'string') {
logErrorSprintf(config, 'hexToValue', 'Invalid hex string: {0}', hex);
return null;
}
let jsonString = '';
for (let i = 0; i < hex.length; i += 2) {
const hexChar = hex.slice(i, i + 2);
const charCode = parseInt(hexChar, 16);
if (isNaN(charCode)) {
logErrorSprintf(config, 'hexToValue', 'Invalid hex character: {0}', hexChar);
return null;
}
jsonString += String.fromCharCode(charCode);
}
try {
const value = JSON.parse(jsonString);
return value;
}
catch (error) {
logErrorSprintf(config, 'hexToValue', 'Error while parsing JSON: {0}', error);
return null;
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function deepEqual(obj1, obj2) {
if (obj1 === obj2)
return true;
if (typeof obj1 !== 'object' || typeof obj2 !== 'object' || obj1 == null || obj2 == null) {
return false;
}
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length)
return false;
for (const key of keys1) {
if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {
return false;
}
}
return true;
}
function onDomReady(callback) {
if (false) {}
return false;
}
function formatLogOutput(level, message, tag) {
const now = new Date();
const formatTwoDigits = (value) => {
return value.toString().padStart(2, '0');
};
const formatMilliseconds = (value) => {
return value.toString().padStart(3, '0');
};
const colorCodes = {
[LogLevel.EMERGENCY]: '\x1b[1;37;41m',
[LogLevel.ALERT]: '\x1b[1;37;45m',
[LogLevel.CRITICAL]: '\x1b[1;37;41m',
[LogLevel.ERROR]: '\x1b[1;37;41m',
[LogLevel.WARNING]: '\x1b[33;1m',
[LogLevel.NOTICE]: '\x1b[36;1m',
[LogLevel.INFO]: '\x1b[32;1m',
[LogLevel.DEBUG]: '\x1b[90;1m',
[LogLevel.NONE]: '',
[LogLevel.ALL]: '\x1b[90;1m'
};
const resetColor = '\x1b[0m';
const colorCode = colorCodes[level] || '';
const year = now.getFullYear();
const month = formatTwoDigits(now.getMonth() + 1);
const day = formatTwoDigits(now.getDate());
const hours = formatTwoDigits(now.getHours());
const minutes = formatTwoDigits(now.getMinutes());
const seconds = formatTwoDigits(now.getSeconds());
const milliseconds = formatMilliseconds(now.getMilliseconds());
const timestamp = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
const levelName = LogLevel[level].padEnd(2);
return `${colorCode}[${timestamp}] [${FLAGSHIP_SDK}] [${levelName}] [${tag}] ${message}${resetColor}`;
}
;// ./src/enum/CacheStrategy.ts
/**
* Define the strategy that will be used for hit caching
*/
var CacheStrategy;
(function (CacheStrategy) {
/**
* When a hit is emitted, it will be first cached in database using IHitCacheImplementation and added into the pool, then after batching and sending, it will also be flushed from database using IHitCacheImplementation.
*
* Note: the SDK has a default cache implementation for browser using localStorage
*/
CacheStrategy[CacheStrategy["CONTINUOUS_CACHING"] = 0] = "CONTINUOUS_CACHING";
/**
* When a hit is emitted, it will be added into the pool, then after batching and sending, all database hits will be flushed, then the entire pool will be cached using IHitCacheImplementation for both actions.
*/
CacheStrategy[CacheStrategy["PERIODIC_CACHING"] = 1] = "PERIODIC_CACHING";
})(CacheStrategy || (CacheStrategy = {}));
;// ./src/config/TrackingManagerConfig.ts
class TrackingManagerConfig {
_batchIntervals;
_poolMaxSize;
_batchStrategy;
constructor(param) {
this.batchIntervals = param?.batchIntervals;
this.poolMaxSize = param?.poolMaxSize;
this._batchStrategy = this.getCacheStrategy(param?.cacheStrategy);
}
getCacheStrategy(cacheStrategy) {
if (typeof cacheStrategy === 'number') {
return cacheStrategy;
}
return (isBrowser() ? CacheStrategy.CONTINUOUS_CACHING : CacheStrategy.PERIODIC_CACHING);
}
get batchIntervals() {
return this._batchIntervals;
}
set batchIntervals(v) {
if (typeof v !== 'number' || v < 0 || v > 10800) {
v = isBrowser() ? DEFAULT_BROWSER_TIME_INTERVAL : DEFAULT_SERVER_TIME_INTERVAL;
}
this._batchIntervals = v;
}
get poolMaxSize() {
return this._poolMaxSize;
}
set poolMaxSize(v) {
if (typeof v !== 'number' || v < 5) {
v = isBrowser() ? DEFAULT_BROWSER_POOL_MAX_SIZE : DEFAULT_SERVER_POOL_MAX_SIZE;
}
this._poolMaxSize = v;
}
get cacheStrategy() {
return this._batchStrategy;
}
}
;// ./src/config/FlagshipConfig.ts
const statusChangeError = 'statusChangedCallback must be a function';
class FlagshipConfig {
_envId;
_apiKey;
_decisionMode;
_timeout;
_logLevel;
_onSdkStatusChanged;
_logManager;
_fetchNow;
_pollingInterval;
_onBucketingUpdated;
_reuseVisitorIds;
_initialBucketing;
_decisionApiUrl;
_hitDeduplicationTime;
_visitorCacheImplementation;
_hitCacheImplementation;
_disableCache;
_trackingManagerConfig;
_onVisitorExposed;
_fetchThirdPartyData;
_nextFetchConfig;
_fetchFlagsBufferingTime;
_disableDeveloperUsageTracking;
_onLog;
_isQAModeEnabled;
_batchActivateHits = false;
get batchActivateHits() {
return this._batchActivateHits;
}
set batchActivateHits(v) {
this._batchActivateHits = v;
}
get isQAModeEnabled() {
return this._isQAModeEnabled;
}
set isQAModeEnabled(v) {
this._isQAModeEnabled = v;
}
_enableAnalytics;
get disableDeveloperUsageTracking() {
return this._disableDeveloperUsageTracking;
}
set disableDeveloperUsageTracking(v) {
this._disableDeveloperUsageTracking = v;
}
get fetchFlagsBufferingTime() {
return this._fetchFlagsBufferingTime;
}
set fetchFlagsBufferingTime(v) {
this._fetchFlagsBufferingTime = v;
}
get nextFetchConfig() {
return this._nextFetchConfig;
}
set nextFetchConfig(v) {
this._nextFetchConfig = v;
}
get fetchThirdPartyData() {
return this._fetchThirdPartyData;
}
set fetchThirdPartyData(v) {
this._fetchThirdPartyData = v;
}
get trackingManagerConfig() {
return this._trackingManagerConfig;
}
get onLog() {
return this._onLog;
}
set onLog(v) {
this._onLog = v;
}
get onVisitorExposed() {
return this._onVisitorExposed;
}
constructor(param) {
const { envId, apiKey, timeout, logLevel, logManager, onSdkStatusChanged, fetchNow, decisionMode, reuseVisitorIds, initialBucketing, decisionApiUrl, hitDeduplicationTime, visitorCacheImplementation, hitCacheImplementation, disableCache, language, sdkVersion, trackingManagerConfig, onLog, onVisitorExposed, nextFetchConfig, fetchFlagsBufferingTime, disableDeveloperUsageTracking, batchActivateHits } = param;
this.initQaMode();
this.initSDKInfo(language, sdkVersion);
if (logManager) {
this.logManager = logManager;
}
this._batchActivateHits = batchActivateHits;
this.fetchFlagsBufferingTime = fetchFlagsBufferingTime ?? FETCH_FLAG_BUFFERING_DEFAULT_TIME;
this.nextFetchConfig = nextFetchConfig || { revalidate: 20 };
this._trackingManagerConfig = new TrackingManagerConfig(trackingManagerConfig || {});
this.onLog = onLog;
this.decisionApiUrl = decisionApiUrl || BASE_API_URL;
this._envId = envId;
this._apiKey = apiKey;
this.logLevel = logLevel ?? LogLevel.INFO;
this.timeout = timeout || REQUEST_TIME_OUT;
this.fetchNow = typeof fetchNow === 'undefined' || fetchNow;
this.reuseVisitorIds = typeof reuseVisitorIds === 'undefined' || reuseVisitorIds;
this._decisionMode = decisionMode || DecisionMode.DECISION_API;
this._initialBucketing = initialBucketing;
this.hitDeduplicationTime = hitDeduplicationTime ?? DEFAULT_DEDUPLICATION_TIME;
this.disableCache