@ref247/tracker-embed
Version:
Ref247.io tracker embed script for your websites!
73 lines (67 loc) • 2.19 kB
JavaScript
import FingerprintJS from '@fingerprintjs/fingerprintjs';
// src/fingerprint.ts
let cachedFingerprint = null;
async function initFingerprint() {
if (cachedFingerprint)
return cachedFingerprint;
try {
const fp = await FingerprintJS.load();
const result = await fp.get();
cachedFingerprint = result.visitorId;
return cachedFingerprint;
}
catch (err) {
console.error('[Ref247] Failed to generate fingerprint:', err);
throw new Error('Fingerprint generation failed');
}
}
// src/utils.ts
function buildTrackingUrl(linkUri, fingerPrintHash) {
const endpoint = 'https://ref247.io/tracking';
const params = new URLSearchParams({
linkUri,
fingerPrintHash
});
return `${endpoint}?${params.toString()}`;
}
// src/tracker.ts
async function track(linkUri, fingerPrintHash) {
const url = buildTrackingUrl(linkUri, fingerPrintHash);
try {
const res = await fetch(url, {
method: 'GET',
mode: 'no-cors',
cache: 'no-store'
});
// Since it's a no-cors request, we can’t inspect the response, just fire and forget
console.debug('[Ref247] Tracking request sent:', url);
}
catch (err) {
console.error('[Ref247] Tracking request failed:', err);
// Optionally, queue or retry if needed
}
}
class Ref247Tracker {
fingerPrintHash;
constructor(fingerPrintHash) {
this.fingerPrintHash = fingerPrintHash;
}
static async init() {
const fingerPrintHash = await initFingerprint();
return new Ref247Tracker(fingerPrintHash);
}
trackClick(linkUri) {
return track(linkUri, this.fingerPrintHash);
}
trackPageView(linkUri) {
return track(linkUri, this.fingerPrintHash);
}
trackOnClick(selector, { linkUri }) {
const el = document.querySelector(selector);
if (!el)
return console.warn(`Ref247Tracker: Element not found for selector ${selector}`);
el.addEventListener('click', () => this.trackClick(linkUri));
}
}
export { Ref247Tracker };
//# sourceMappingURL=ref247-tracker-embed.mjs.map