@ezbot-ai/javascript-sdk
Version:
The easiest way to interact with ezbot via JS (node and browser)
137 lines • 10.6 kB
JavaScript
/* eslint-disable functional/immutable-data */
/*
* This package uses source code from Snowplow Analytics Ltd
* Copyright (c) 2022 Snowplow Analytics Ltd, 2010 Anthon Pang
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import { enableButtonClickTracking } from '@snowplow/browser-plugin-button-click-tracking';
import { enableLinkClickTracking } from '@snowplow/browser-plugin-link-click-tracking';
import { addGlobalContexts, newTracker, } from '@snowplow/browser-tracker';
import { defaultWebConfiguration, ezbotPredictionsContextSchemaPath, ezbotTrackerDomain, plugins, } from './constants';
import { getPredictions } from './predictions';
import { setUserId, setUserIdFromCookie, startActivityTracking, trackLinkClick, trackPageView, trackRewardEvent, } from './tracking';
import { createCrossDomainLinkChecker } from './utils/crossDomainLinker';
import { makeVisualChange, makeVisualChanges, visualChanges, visualUtils, } from './visualChanges';
const ezbotTrackerId = 'ezbot';
async function initEzbot(projectId, userId, _config = defaultWebConfiguration) {
const existingTracker = window.ezbot?.tracker;
if (existingTracker) {
existingTracker.setUserId(userId);
return existingTracker;
}
// Prepare tracker configuration
const trackerConfig = {
appId: projectId.toString(),
plugins: plugins,
stateStorageStrategy: 'localStorage',
discoverRootDomain: true,
};
// Handle cross-domain tracking if enabled
if (_config?.crossDomain?.enabled) {
if (!_config?.crossDomain.domains.length) {
throw new Error('Cross-domain tracking enabled but no domains provided');
}
const extendedCrossDomainLinkerOptions = {
userId: true,
sessionId: true,
};
trackerConfig.useExtendedCrossDomainLinker =
extendedCrossDomainLinkerOptions;
const crossDomainLinkerFunction = createCrossDomainLinkChecker(_config.crossDomain.domains);
trackerConfig.crossDomainLinker = crossDomainLinkerFunction;
}
const tracker = newTracker(ezbotTrackerId, ezbotTrackerDomain, trackerConfig);
if (!tracker) {
throw new Error('Failed to initialize tracker');
}
if (userId) {
tracker.setUserId(userId);
}
tracker.setUserIdFromReferrer('_sp');
const domainUserInfo = tracker.getDomainUserInfo();
// eslint-disable-next-line functional/no-let
let sessionId = domainUserInfo[6];
// TODO: this should happen automatically somehow
if (window.location.href.includes('_sp=')) {
// get sessionId for cross-domain linking
const urlParams = new URLSearchParams(window.location.search);
const snowPlowParams = urlParams.get('_sp');
if (snowPlowParams != null) {
sessionId = snowPlowParams.split('.')[2];
}
}
// eslint-disable-next-line functional/no-let
let predictions = [];
try {
predictions = await getPredictions(projectId, sessionId, tracker);
}
catch (error) {
console.error('Failed to get predictions', error);
}
const predictionsContext = {
schema: ezbotPredictionsContextSchemaPath,
data: {
predictions: predictions.map((pred) => ({
variable: pred.key,
value: pred.value,
})),
},
};
addGlobalContexts([predictionsContext], [tracker.id]);
window.ezbot = {
trackerConfig: trackerConfig,
userId: userId,
tracker: tracker,
predictions: predictions,
sessionId: sessionId,
trackPageView: trackPageView, // only send to ezbot tracker
trackRewardEvent: trackRewardEvent,
startActivityTracking: startActivityTracking,
makeVisualChanges: makeVisualChanges,
setUserId: setUserId,
setUserIdFromCookie: setUserIdFromCookie,
utils: {
visual: visualUtils,
},
actions: {
visual: visualChanges,
},
intervals: [],
mode: 'ezbot',
};
try {
enableLinkClickTracking();
enableButtonClickTracking();
}
catch (error) {
console.error('Failed to enable click tracking', error);
}
return tracker;
}
export { trackRewardEvent, initEzbot, makeVisualChange, makeVisualChanges, startActivityTracking, trackLinkClick, trackPageView, setUserId, setUserIdFromCookie, };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXpib3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2V6Ym90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhDQUE4QztBQUU5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQ0wsaUJBQWlCLEVBR2pCLFVBQVUsR0FFWCxNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUNBQWlDLEVBQ2pDLGtCQUFrQixFQUNsQixPQUFPLEdBQ1IsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGFBQWEsRUFDYixnQkFBZ0IsR0FDakIsTUFBTSxZQUFZLENBQUM7QUFZcEIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLFdBQVcsR0FDWixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUUvQixLQUFLLFVBQVUsU0FBUyxDQUN0QixTQUFpQixFQUNqQixNQUFzQixFQUN0QixVQUE4Qix1QkFBNkM7SUFFM0UsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7SUFDOUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFF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