src/tracking.js
/* @flow */
import {
noop,
stringifyError,
stringifyErrorMessage,
isIEIntranet,
getResourceLoadTime,
waitForWindowReady,
ATTRIBUTES,
} from "@krakenjs/belter/src";
import { ZalgoPromise } from "@krakenjs/zalgo-promise/src";
import {
FPTI_KEY,
FPTI_FEED,
FPTI_DATA_SOURCE,
FPTI_SDK_NAME,
FPTI_USER_ACTION,
} from "@paypal/sdk-constants/src";
import { getEnv, getVersion, getCorrelationID } from "./global";
import {
getPartnerAttributionID,
getClientID,
getMerchantID,
getCommit,
getLocale,
getSDKScript,
getSDKIntegrationSource,
getPageType,
} from "./script";
import { getSessionID } from "./session";
import { getLogger } from "./logger";
import { isPayPalDomain } from "./domains";
let sdkInitTime;
export function getSDKInitTime(): number {
if (typeof sdkInitTime === "undefined") {
throw new TypeError(`SDK not initialized`);
}
return sdkInitTime;
}
export function setupLogger() {
const logger = getLogger();
sdkInitTime = Date.now();
logger.addPayloadBuilder(() => {
return {
referer: window.location.host,
uid: getSessionID(),
env: getEnv(),
};
});
logger.addTrackingBuilder(() => {
const { lang, country } = getLocale();
const mID = getMerchantID();
return {
[FPTI_KEY.FEED]: FPTI_FEED.PAYMENTS_SDK,
[FPTI_KEY.DATA_SOURCE]: FPTI_DATA_SOURCE.PAYMENTS_SDK,
[FPTI_KEY.CLIENT_ID]: getClientID(),
[FPTI_KEY.SELLER_ID]: mID && mID.toString(),
[FPTI_KEY.SESSION_UID]: getSessionID(),
[FPTI_KEY.REFERER]: window.location.host,
[FPTI_KEY.LOCALE]: `${lang}_${country}`,
[FPTI_KEY.INTEGRATION_IDENTIFIER]: getClientID(),
[FPTI_KEY.PARTNER_ATTRIBUTION_ID]: getPartnerAttributionID(),
[FPTI_KEY.PAGE_TYPE]: getPageType(),
[FPTI_KEY.SDK_NAME]: FPTI_SDK_NAME.PAYMENTS_SDK,
[FPTI_KEY.SDK_VERSION]: getVersion(),
[FPTI_KEY.USER_AGENT]: window.navigator && window.navigator.userAgent,
[FPTI_KEY.USER_ACTION]: getCommit()
? FPTI_USER_ACTION.COMMIT
: FPTI_USER_ACTION.CONTINUE,
[FPTI_KEY.CONTEXT_CORRID]: getCorrelationID(),
[FPTI_KEY.SDK_INTEGRATION_SOURCE]: getSDKIntegrationSource(),
};
});
ZalgoPromise.onPossiblyUnhandledException((err) => {
logger.track({
[FPTI_KEY.ERROR_CODE]: "payments_sdk_error",
[FPTI_KEY.ERROR_DESC]: stringifyErrorMessage(err),
});
logger.error("unhandled_error", {
err: stringifyError(err),
});
// eslint-disable-next-line promise/no-promise-in-callback
logger.flush().catch(noop);
});
waitForWindowReady().then(() => {
const sdkScript = getSDKScript();
const loadTime = getResourceLoadTime(sdkScript.src);
let cache;
if (loadTime === 0) {
cache = "sdk_client_cache_hit";
} else if (typeof loadTime === "number") {
cache = "sdk_client_cache_miss";
} else {
cache = "sdk_client_cache_unknown";
}
// Exclude apps that use the JS SDK and are hosted directly on www.paypal.com. Ex:
// https://www.paypal.com/buttons/smart
// https://www.paypal.com/us/gifts/
const isLoadedInFrame = isPayPalDomain() && window.xprops;
logger
.info(`setup_${getEnv()}`)
.info(`setup_${getEnv()}_${getVersion().replace(/\./g, "_")}`)
.info(
`sdk_${isLoadedInFrame ? "paypal" : "non_paypal"}_domain_script_uid_${
sdkScript.hasAttribute(ATTRIBUTES.UID) ? "present" : "missing"
}`
)
.info(cache)
.track({
[FPTI_KEY.TRANSITION]: "process_js_sdk_init_client",
[FPTI_KEY.SDK_LOAD_TIME]:
typeof loadTime === "number" ? loadTime.toString() : undefined,
[FPTI_KEY.SDK_CACHE]: cache,
})
.flush();
if (isIEIntranet()) {
logger.warn("ie_intranet_mode");
}
});
}