@ezbot-ai/javascript-sdk
Version:
The easiest way to interact with ezbot via JS (node and browser)
56 lines • 4.76 kB
JavaScript
/**
* Checks if a link is a cross-domain link that should be tracked.
*
* @param linkElement - The anchor element to check
* @param allowedDomains - List of allowed domains for cross-domain tracking
* @returns boolean indicating if this is a cross-domain link to an allowed domain
*/
export function isCrossDomainLink(linkElement, allowedDomains) {
// Get the current location's hostname and port
const currentHostname = window.location.hostname;
const currentPort = window.location.port;
// Create a URL object from the link's href
try {
const linkUrl = new URL(linkElement.href);
// 1. Check if hostname and port on linkElement and location are a match
const isSameDomain = linkUrl.hostname === currentHostname && linkUrl.port === currentPort;
if (isSameDomain) {
// 2. If they are a match, return false (no cross-domain linking needed)
return false;
}
// 3. Check if the linkElement hostname is in the allowed list
// 4 & 5. Check if the link's hostname is in the allowed domains list
return allowedDomains.some((domain) => {
// Remove protocol if present in the domain
const cleanDomain = domain.replace(/^https?:\/\//, '');
// Create a combined hostname:port string from the link URL for comparison
const linkHostWithPort = linkUrl.port
? linkUrl.hostname + ':' + linkUrl.port
: linkUrl.hostname;
// Check if the link matches domain in various ways
const exactMatch = linkHostWithPort === cleanDomain;
const hostnameOnlyMatch = linkUrl.hostname === cleanDomain;
const subdomainMatch = linkUrl.hostname.endsWith('.' + cleanDomain) ||
(cleanDomain.includes(':') &&
linkHostWithPort.endsWith('.' + cleanDomain.split(':')[0] + ':' + cleanDomain.split(':')[1]));
return exactMatch || hostnameOnlyMatch || subdomainMatch;
});
}
catch (e) {
// If the href is invalid, return false
return false;
}
}
/**
* Creates a cross-domain link checker function that only requires the linkElement parameter.
* The allowed domains are captured in the closure.
*
* @param allowedDomains - List of allowed domains for cross-domain tracking
* @returns A function that takes only a linkElement and checks if it's a cross-domain link
*/
export function createCrossDomainLinkChecker(allowedDomains) {
return (linkElement) => {
return isCrossDomainLink(linkElement, allowedDomains);
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NEb21haW5MaW5rZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzL2Nyb3NzRG9tYWluTGlua2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsV0FBMEQsRUFDMUQsY0FBaUM7SUFFakMsK0NBQStDO0lBQy9DLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBRXpDLDJDQUEyQztJQUMzQyxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUMsd0VBQXdFO1FBQ3hFLE1BQU0sWUFBWSxHQUNoQixPQUFPLENBQUMsUUFBUSxLQUFLLGVBQWUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztRQUV2RSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLHdFQUF3RTtZQUN4RSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCw4REFBOEQ7UUFDOUQscUVBQXFFO1FBQ3JFLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3BDLDJDQUEyQztZQUMzQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV2RCwwRUFBMEU7WUFDMUUsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSTtnQkFDbkMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJO2dCQUN2QyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUVyQixtREFBbUQ7WUFDbkQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLEtBQUssV0FBVyxDQUFDO1lBQ3BELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxXQUFXLENBQUM7WUFDM0QsTUFBTSxjQUFjLEdBQ2xCLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUM7Z0JBQzVDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7b0JBQ3hCLGdCQUFnQixDQUFDLFFBQVEsQ0FDdkIsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2xFLENBQUMsQ0FBQztZQUVQLE9BQU8sVUFBVSxJQUFJLGlCQUFpQixJQUFJLGNBQWMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsdUNBQXVDO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLGNBQWlDO0lBRWpDLE9BQU8sQ0FDTCxXQUEwRCxFQUNqRCxFQUFFO1FBQ1gsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9