@tracetail/vue
Version:
Vue SDK for TraceTail browser fingerprinting - over 99.5% accuracy
222 lines (207 loc) • 8.85 kB
JavaScript
;
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