@tracetail/angular
Version:
Angular SDK for TraceTail browser fingerprinting - over 99.5% accuracy
77 lines • 9.19 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../tracetail.service";
export class FraudDetectionDirective {
el;
traceTail;
appFraudDetection = 'medium';
disableOnRisk = true;
cssClass = 'high-risk';
subscription = null;
constructor(el, traceTail) {
this.el = el;
this.traceTail = traceTail;
}
ngOnInit() {
this.subscription = this.traceTail.fingerprint$.subscribe(fingerprint => {
if (!fingerprint)
return;
const thresholds = {
low: 0.3,
medium: 0.5,
high: 0.7
};
const threshold = thresholds[this.appFraudDetection];
const isHighRisk = fingerprint.riskScore > threshold;
// Apply or remove CSS class
if (isHighRisk) {
this.el.nativeElement.classList.add(this.cssClass);
// Optionally disable the element
if (this.disableOnRisk && this.isFormElement()) {
this.el.nativeElement.setAttribute('disabled', 'true');
this.el.nativeElement.setAttribute('title', 'High fraud risk detected');
}
}
else {
this.el.nativeElement.classList.remove(this.cssClass);
if (this.disableOnRisk && this.isFormElement()) {
this.el.nativeElement.removeAttribute('disabled');
this.el.nativeElement.removeAttribute('title');
}
}
// Emit custom event
this.el.nativeElement.dispatchEvent(new CustomEvent('fraudStatusChange', {
detail: {
isHighRisk,
riskScore: fingerprint.riskScore,
threshold
},
bubbles: true
}));
});
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
isFormElement() {
const tagName = this.el.nativeElement.tagName.toLowerCase();
return ['input', 'button', 'select', 'textarea', 'form'].includes(tagName);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FraudDetectionDirective, deps: [{ token: i0.ElementRef }, { token: i1.TraceTailService }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FraudDetectionDirective, selector: "[appFraudDetection]", inputs: { appFraudDetection: "appFraudDetection", disableOnRisk: "disableOnRisk", cssClass: "cssClass" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FraudDetectionDirective, decorators: [{
type: Directive,
args: [{
selector: '[appFraudDetection]'
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.TraceTailService }], propDecorators: { appFraudDetection: [{
type: Input
}], disableOnRisk: [{
type: Input
}], cssClass: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWQtZGV0ZWN0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGlyZWN0aXZlcy9mcmF1ZC1kZXRlY3Rpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUlOLE1BQU0sZUFBZSxDQUFDOzs7QUFPdkIsTUFBTSxPQUFPLHVCQUF1QjtJQVF4QjtJQUNBO0lBUkQsaUJBQWlCLEdBQThCLFFBQVEsQ0FBQztJQUN4RCxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLFFBQVEsR0FBRyxXQUFXLENBQUM7SUFFeEIsWUFBWSxHQUF3QixJQUFJLENBQUM7SUFFakQsWUFDVSxFQUEyQixFQUMzQixTQUEyQjtRQUQzQixPQUFFLEdBQUYsRUFBRSxDQUF5QjtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtJQUNsQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3RFLElBQUksQ0FBQyxXQUFXO2dCQUFFLE9BQU87WUFFekIsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEdBQUcsRUFBRSxHQUFHO2dCQUNSLE1BQU0sRUFBRSxHQUFHO2dCQUNYLElBQUksRUFBRSxHQUFHO2FBQ1YsQ0FBQztZQUVGLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNyRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUVyRCw0QkFBNEI7WUFDNUIsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRW5ELGlDQUFpQztnQkFDakMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtvQkFDOUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO2lCQUN6RTthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUV0RCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO29CQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ2xELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDaEQ7YUFDRjtZQUVELG9CQUFvQjtZQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3ZFLE1BQU0sRUFBRTtvQkFDTixVQUFVO29CQUNWLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztvQkFDaEMsU0FBUztpQkFDVjtnQkFDRCxPQUFPLEVBQUUsSUFBSTthQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVELE9BQU8sQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdFLENBQUM7d0dBaEVVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQUhuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7aUJBQ2hDOzhHQUVVLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBcbiAgRGlyZWN0aXZlLCBcbiAgSW5wdXQsIFxuICBFbGVtZW50UmVmLCBcbiAgT25Jbml0LCBcbiAgT25EZXN0cm95IFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhY2VUYWlsU2VydmljZSB9IGZyb20gJy4uL3RyYWNldGFpbC5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2FwcEZyYXVkRGV0ZWN0aW9uXSdcbn0pXG5leHBvcnQgY2xhc3MgRnJhdWREZXRlY3Rpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGFwcEZyYXVkRGV0ZWN0aW9uOiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnID0gJ21lZGl1bSc7XG4gIEBJbnB1dCgpIGRpc2FibGVPblJpc2sgPSB0cnVlO1xuICBASW5wdXQoKSBjc3NDbGFzcyA9ICdoaWdoLXJpc2snO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIHRyYWNlVGFpbDogVHJhY2VUYWlsU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnRyYWNlVGFpbC5maW5nZXJwcmludCQuc3Vic2NyaWJlKGZpbmdlcnByaW50ID0+IHtcbiAgICAgIGlmICghZmluZ2VycHJpbnQpIHJldHVybjtcblxuICAgICAgY29uc3QgdGhyZXNob2xkcyA9IHtcbiAgICAgICAgbG93OiAwLjMsXG4gICAgICAgIG1lZGl1bTogMC41LFxuICAgICAgICBoaWdoOiAwLjdcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRocmVzaG9sZHNbdGhpcy5hcHBGcmF1ZERldGVjdGlvbl07XG4gICAgICBjb25zdCBpc0hpZ2hSaXNrID0gZmluZ2VycHJpbnQucmlza1Njb3JlID4gdGhyZXNob2xkO1xuXG4gICAgICAvLyBBcHBseSBvciByZW1vdmUgQ1NTIGNsYXNzXG4gICAgICBpZiAoaXNIaWdoUmlzaykge1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmNzc0NsYXNzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE9wdGlvbmFsbHkgZGlzYWJsZSB0aGUgZWxlbWVudFxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlT25SaXNrICYmIHRoaXMuaXNGb3JtRWxlbWVudCgpKSB7XG4gICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAndHJ1ZScpO1xuICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0hpZ2ggZnJhdWQgcmlzayBkZXRlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmNzc0NsYXNzKTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVPblJpc2sgJiYgdGhpcy5pc0Zvcm1FbGVtZW50KCkpIHtcbiAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBjdXN0b20gZXZlbnRcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZnJhdWRTdGF0dXNDaGFuZ2UnLCB7XG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGlzSGlnaFJpc2ssXG4gICAgICAgICAgcmlza1Njb3JlOiBmaW5nZXJwcmludC5yaXNrU2NvcmUsXG4gICAgICAgICAgdGhyZXNob2xkXG4gICAgICAgIH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRm9ybUVsZW1lbnQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIFsnaW5wdXQnLCAnYnV0dG9uJywgJ3NlbGVjdCcsICd0ZXh0YXJlYScsICdmb3JtJ10uaW5jbHVkZXModGFnTmFtZSk7XG4gIH1cbn0iXX0=