UNPKG

@tracetail/angular

Version:

Angular SDK for TraceTail browser fingerprinting - over 99.5% accuracy

77 lines 9.19 kB
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=