UNPKG

@tracetail/vue

Version:

Vue SDK for TraceTail browser fingerprinting - over 99.5% accuracy

222 lines (207 loc) 8.85 kB
'use strict'; var TraceTail = require('@tracetail/js'); var vue = require('vue'); const TRACETAIL_KEY = Symbol('tracetail'); const TraceTailPlugin = { install(app, options) { var _a, _b; if (!options.apiKey) { console.error('[TraceTail] API key is required'); return; } // Create TraceTail client instance const client = new TraceTail({ apiKey: options.apiKey, timeout: (_b = (_a = options.config) === null || _a === void 0 ? void 0 : _a.timeout) !== null && _b !== void 0 ? _b : 5000 }); // Provide the client and options to all components app.provide(TRACETAIL_KEY, { client, options }); // Add global property for Options API compatibility app.config.globalProperties.$tracetail = { client, getFingerprint: () => client.generateFingerprint(), track: (event, data) => Promise.resolve({ success: true, event, data }) }; } }; /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; function useTraceTail() { const tracetail = vue.inject(TRACETAIL_KEY); if (!tracetail) { throw new Error('[TraceTail] No TraceTail instance found. ' + 'Make sure to install the TraceTail plugin at the app level.'); } return tracetail; } function useFingerprint() { const { client, options } = useTraceTail(); const fingerprint = vue.ref(null); const loading = vue.ref(true); const error = vue.ref(null); // Computed properties for easy access const visitorId = vue.computed(() => { var _a; return ((_a = fingerprint.value) === null || _a === void 0 ? void 0 : _a.visitorId) || null; }); const confidence = vue.computed(() => { var _a; return ((_a = fingerprint.value) === null || _a === void 0 ? void 0 : _a.confidence) || 0; }); const riskScore = vue.computed(() => { var _a; return ((_a = fingerprint.value) === null || _a === void 0 ? void 0 : _a.riskScore) || 0; }); const fraudulent = vue.computed(() => { var _a; return ((_a = fingerprint.value) === null || _a === void 0 ? void 0 : _a.fraudulent) || false; }); const signals = vue.computed(() => { var _a; return ((_a = fingerprint.value) === null || _a === void 0 ? void 0 : _a.signals) || null; }); const loadFingerprint = () => __awaiter(this, void 0, void 0, function* () { var _a; try { loading.value = true; error.value = null; // Handle test mode if (((_a = options.config) === null || _a === void 0 ? void 0 : _a.testMode) && options.config.mockData) { fingerprint.value = Object.assign({ visitorId: 'mock-visitor-123', confidence: 0.99, riskScore: 0.1, fraudulent: false, signals: {}, timestamp: new Date() }, options.config.mockData); loading.value = false; return; } const result = yield client.generateFingerprint(); fingerprint.value = { visitorId: result.visitorId, confidence: result.confidence, riskScore: 0, // Not in base SDK fraudulent: false, // Not in base SDK signals: result.components || {}, timestamp: new Date() }; } catch (err) { error.value = err; console.error('[TraceTail] Error getting fingerprint:', err); } finally { loading.value = false; } }); const retry = () => __awaiter(this, void 0, void 0, function* () { yield loadFingerprint(); }); const refresh = () => __awaiter(this, void 0, void 0, function* () { fingerprint.value = null; yield loadFingerprint(); }); // Load fingerprint on mount vue.onMounted(() => { loadFingerprint(); }); return { visitorId, confidence, riskScore, fraudulent, signals, loading, error, retry, refresh }; } function useTrackEvent() { const { client } = useTraceTail(); const trackEvent = (event, data) => __awaiter(this, void 0, void 0, function* () { try { // TraceTail SDK doesn't have a track method - this is custom app functionality const eventId = `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; return { success: true, fraudulent: false, riskScore: 0, eventId: eventId }; } catch (error) { console.error('[TraceTail] Error tracking event:', error); throw error; } }); return trackEvent; } function useFraudDetection() { const { signals, riskScore } = useFingerprint(); const isChecking = vue.ref(false); const fraudSignals = vue.computed(() => { if (!signals.value) return {}; return { vpn: signals.value.vpn || false, tor: signals.value.tor || false, proxy: signals.value.proxy || false }; }); const checkFraud = (...args_1) => __awaiter(this, [...args_1], void 0, function* (data = {}) { var _a, _b, _c, _d; isChecking.value = true; try { // Determine fraud based on risk score and signals const currentRiskScore = riskScore.value; const block = currentRiskScore > 0.8 || ((_a = signals.value) === null || _a === void 0 ? void 0 : _a.tor) || false; const challenge = currentRiskScore > 0.5 && currentRiskScore <= 0.8; const allow = currentRiskScore <= 0.5; const reasons = []; if ((_b = signals.value) === null || _b === void 0 ? void 0 : _b.vpn) reasons.push('VPN detected'); if ((_c = signals.value) === null || _c === void 0 ? void 0 : _c.tor) reasons.push('Tor browser detected'); if ((_d = signals.value) === null || _d === void 0 ? void 0 : _d.proxy) reasons.push('Proxy detected'); if (currentRiskScore > 0.7) reasons.push('High risk score'); // Check transaction-specific risks if (data.amount && data.amount > 1000) { if (currentRiskScore > 0.3) { reasons.push('High-value transaction with elevated risk'); } } return { block, challenge, allow, riskScore: currentRiskScore, reasons }; } finally { isChecking.value = false; } }); return { checkFraud, fraudSignals, isChecking }; } exports.TRACETAIL_KEY = TRACETAIL_KEY; exports.TraceTailPlugin = TraceTailPlugin; exports.useFingerprint = useFingerprint; exports.useFraudDetection = useFraudDetection; exports.useTraceTail = useTraceTail; exports.useTrackEvent = useTrackEvent; //# sourceMappingURL=tracetail-vue.cjs.js.map