@tracetail/angular 2.3.11 → 2.3.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -102,19 +102,19 @@ Automatically add visitor ID to all API requests:
102
102
  // Adds X-TraceTail-Visitor-ID header to requests
103
103
  ```
104
104
 
105
- ### 📊 Event Tracking
105
+ ### 📊 Sending app events
106
106
 
107
- Track user actions with fraud detection:
107
+ `@tracetail/angular` does **not** implement a hosted event-tracking API. Instead, collect a fingerprint and send the identifiers you need to your own backend:
108
108
 
109
109
  ```typescript
110
110
  async onLogin(credentials: any) {
111
- const result = await this.traceTail.trackEvent('login', {
111
+ const fp = await this.traceTail.getFingerprint();
112
+
113
+ await this.http.post('/api/events/login', {
114
+ visitorId: fp.visitorId,
115
+ requestId: (fp as any).requestId,
112
116
  username: credentials.username
113
- });
114
-
115
- if (result.fraudulent) {
116
- // Handle fraud
117
- }
117
+ }).toPromise();
118
118
  }
119
119
  ```
120
120
 
@@ -126,7 +126,7 @@ async onLogin(credentials: any) {
126
126
  - `loading$: Observable<boolean>` - Loading state
127
127
  - `error$: Observable<Error>` - Error state
128
128
  - `getFingerprint(): Promise<Fingerprint>` - Get fingerprint as promise
129
- - `trackEvent(event, data?): Promise<TrackingResult>` - Track events
129
+ - `trackEvent(event, data?): Promise<TrackingResult>` - Throws a descriptive error because event ingestion must be implemented in your own backend or analytics pipeline
130
130
  - `checkFraud(data): Promise<FraudResult>` - Check fraud risk
131
131
  - `retry(): void` - Retry fingerprinting
132
132
  - `refresh(): Promise<void>` - Force refresh
@@ -198,9 +198,13 @@ export class PersonalizationService {
198
198
 
199
199
  - 📚 [Documentation](https://docs.tracetail.com/angular)
200
200
  - 💬 [Discord Community](https://discord.gg/tracetail)
201
- - 📧 [Email Support](mailto:support@tracetail.com)
201
+ - 📧 [Email Support](mailto:support@tracetail.io)
202
202
  - 🐛 [Issue Tracker](https://github.com/tracetail/tracetail/issues)
203
203
 
204
204
  ## License
205
205
 
206
+ MIT - see [LICENSE](LICENSE) for details.com/tracetail/tracetail/issues)
207
+
208
+ ## License
209
+
206
210
  MIT - see [LICENSE](LICENSE) for details.
package/dist/README.md CHANGED
@@ -102,19 +102,19 @@ Automatically add visitor ID to all API requests:
102
102
  // Adds X-TraceTail-Visitor-ID header to requests
103
103
  ```
104
104
 
105
- ### 📊 Event Tracking
105
+ ### 📊 Sending app events
106
106
 
107
- Track user actions with fraud detection:
107
+ `@tracetail/angular` does **not** implement a hosted event-tracking API. Instead, collect a fingerprint and send the identifiers you need to your own backend:
108
108
 
109
109
  ```typescript
110
110
  async onLogin(credentials: any) {
111
- const result = await this.traceTail.trackEvent('login', {
111
+ const fp = await this.traceTail.getFingerprint();
112
+
113
+ await this.http.post('/api/events/login', {
114
+ visitorId: fp.visitorId,
115
+ requestId: (fp as any).requestId,
112
116
  username: credentials.username
113
- });
114
-
115
- if (result.fraudulent) {
116
- // Handle fraud
117
- }
117
+ }).toPromise();
118
118
  }
119
119
  ```
120
120
 
@@ -126,7 +126,7 @@ async onLogin(credentials: any) {
126
126
  - `loading$: Observable<boolean>` - Loading state
127
127
  - `error$: Observable<Error>` - Error state
128
128
  - `getFingerprint(): Promise<Fingerprint>` - Get fingerprint as promise
129
- - `trackEvent(event, data?): Promise<TrackingResult>` - Track events
129
+ - `trackEvent(event, data?): Promise<TrackingResult>` - Throws a descriptive error because event ingestion must be implemented in your own backend or analytics pipeline
130
130
  - `checkFraud(data): Promise<FraudResult>` - Check fraud risk
131
131
  - `retry(): void` - Retry fingerprinting
132
132
  - `refresh(): Promise<void>` - Force refresh
@@ -198,9 +198,13 @@ export class PersonalizationService {
198
198
 
199
199
  - 📚 [Documentation](https://docs.tracetail.com/angular)
200
200
  - 💬 [Discord Community](https://discord.gg/tracetail)
201
- - 📧 [Email Support](mailto:support@tracetail.com)
201
+ - 📧 [Email Support](mailto:support@tracetail.io)
202
202
  - 🐛 [Issue Tracker](https://github.com/tracetail/tracetail/issues)
203
203
 
204
204
  ## License
205
205
 
206
+ MIT - see [LICENSE](LICENSE) for details.com/tracetail/tracetail/issues)
207
+
208
+ ## License
209
+
206
210
  MIT - see [LICENSE](LICENSE) for details.
@@ -32,11 +32,13 @@ export class TraceTailService {
32
32
  this.loadingSubject.next(false);
33
33
  return;
34
34
  }
35
- // Initialize real client
35
+ // Initialize real client. Pass through endpoint so a custom config.endpoint is
36
+ // honored (previously dropped, so it always defaulted to '/api').
36
37
  this.client = new TraceTail({
37
38
  apiKey: this.config.apiKey,
38
39
  timeout: this.config.config?.timeout,
39
- debug: this.config.config?.debug || false
40
+ debug: this.config.config?.debug || false,
41
+ ...(this.config.config?.endpoint ? { endpoint: this.config.config.endpoint } : {})
40
42
  });
41
43
  // Get initial fingerprint
42
44
  this.loadFingerprint();
@@ -100,21 +102,8 @@ export class TraceTailService {
100
102
  * Track an event
101
103
  */
102
104
  async trackEvent(event, data) {
103
- try {
104
- // TraceTail doesn't have a track method - this is custom app functionality
105
- // For now, just return mock data with a generated event ID
106
- const eventId = `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
107
- return {
108
- success: true,
109
- fraudulent: false,
110
- riskScore: 0,
111
- eventId: eventId
112
- };
113
- }
114
- catch (error) {
115
- console.error('Track event error:', error);
116
- throw error;
117
- }
105
+ console.warn('[TraceTail] trackEvent() was called with:', { event, data });
106
+ throw new Error('[TraceTail] Event tracking is not implemented in @tracetail/angular. Use getFingerprint() to collect visitorId/requestId, then send your event to your own backend or analytics pipeline.');
118
107
  }
119
108
  /**
120
109
  * Check for fraud
@@ -179,4 +168,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
179
168
  type: Inject,
180
169
  args: [TRACETAIL_CONFIG]
181
170
  }] }] });
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2V0YWlsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYWNldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQXdCLE1BQU0sTUFBTSxDQUFDO0FBRTdELE9BQU8sU0FBUyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFXdEQsTUFBTSxPQUFPLGdCQUFnQjtJQVVtQjtJQVR0QyxNQUFNLENBQVk7SUFDbEIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO0lBQ25FLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNwRCxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLENBQUM7SUFFL0QsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUxQyxZQUE4QyxNQUF1QjtRQUF2QixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUk7WUFDRixtQkFBbUI7WUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUMvRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO29C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Z0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFXYyxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBmcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2hhcmVSZXBsYXksIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBUcmFjZVRhaWwgZnJvbSAnQHRyYWNldGFpbC9qcyc7XG5pbXBvcnQgeyBUUkFDRVRBSUxfQ09ORklHIH0gZnJvbSAnLi90cmFjZXRhaWwuY29uZmlnJztcbmltcG9ydCB7IFxuICBUcmFjZVRhaWxDb25maWcsIFxuICBGaW5nZXJwcmludCwgXG4gIFRyYWNraW5nUmVzdWx0LCBcbiAgRnJhdWRSZXN1bHQgXG59IGZyb20gJy4vdHJhY2V0YWlsLnR5cGVzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVHJhY2VUYWlsU2VydmljZSB7XG4gIHByaXZhdGUgY2xpZW50OiBUcmFjZVRhaWw7XG4gIHByaXZhdGUgZmluZ2VycHJpbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaW5nZXJwcmludCB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIGxvYWRpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHJpdmF0ZSBlcnJvclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVycm9yIHwgbnVsbD4obnVsbCk7XG5cbiAgZmluZ2VycHJpbnQkID0gdGhpcy5maW5nZXJwcmludFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGxvYWRpbmckID0gdGhpcy5sb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgZXJyb3IkID0gdGhpcy5lcnJvclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChUUkFDRVRBSUxfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVHJhY2VUYWlsQ29uZmlnKSB7XG4gICAgdGhpcy5pbml0aWFsaXplQ2xpZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDbGllbnQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEhhbmRsZSB0ZXN0IG1vZGVcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5jb25maWc/LnRlc3RNb2RlICYmIHRoaXMuY29uZmlnLmNvbmZpZy5tb2NrRGF0YSkge1xuICAgICAgICB0aGlzLmZpbmdlcnByaW50U3ViamVjdC5uZXh0KHtcbiAgICAgICAgICB2aXNpdG9ySWQ6ICdtb2NrLXZpc2l0b3ItMTIzJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAwLjk5LFxuICAgICAgICAgIHJpc2tTY29yZTogMC4xLFxuICAgICAgICAgIGZyYXVkdWxlbnQ6IGZhbHNlLFxuICAgICAgICAgIHNpZ25hbHM6IHt9LFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgICAuLi50aGlzLmNvbmZpZy5jb25maWcubW9ja0RhdGFcbiAgICAgICAgfSBhcyBGaW5nZXJwcmludCk7XG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSByZWFsIGNsaWVudFxuICAgICAgdGhpcy5jbGllbnQgPSBuZXcgVHJhY2VUYWlsKHtcbiAgICAgICAgYXBpS2V5OiB0aGlzLmNvbmZpZy5hcGlLZXksXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLmNvbmZpZz8udGltZW91dCxcbiAgICAgICAgZGVidWc6IHRoaXMuY29uZmlnLmNvbmZpZz8uZGVidWcgfHwgZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgaW5pdGlhbCBmaW5nZXJwcmludFxuICAgICAgdGhpcy5sb2FkRmluZ2VycHJpbnQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmluZ2VycHJpbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIHRoaXMuZXJyb3JTdWJqZWN0Lm5leHQobnVsbCk7XG5cbiAgICAgIC8vIFVzZSB2ZXJib3NlOiB0cnVlIHRvIGdldCBjb21wb25lbnRzIGluIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jbGllbnQuZ2VuZXJhdGVGaW5nZXJwcmludCh7IHZlcmJvc2U6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGZpbmdlcnByaW50OiBGaW5nZXJwcmludCA9IHtcbiAgICAgICAgdmlzaXRvcklkOiByZXN1bHQudmlzaXRvcklkLFxuICAgICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcbiAgICAgICAgcmlza1Njb3JlOiAwLCAgLy8gRGVmYXVsdCB2YWx1ZSAtIG5vdCBpbiBiYXNlIFNES1xuICAgICAgICBmcmF1ZHVsZW50OiBmYWxzZSwgIC8vIERlZmF1bHQgdmFsdWUgLSBub3QgaW4gYmFzZSBTREtcbiAgICAgICAgc2lnbmFsczogcmVzdWx0LmNvbXBvbmVudHMgfHwge30sXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgcHJvY2Vzc2luZ1RpbWU6IHJlc3VsdC5wcm9jZXNzaW5nVGltZVxuICAgICAgfTtcblxuICAgICAgdGhpcy5maW5nZXJwcmludFN1YmplY3QubmV4dChmaW5nZXJwcmludCk7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RyYWNlVGFpbCBlcnJvcjonLCBlcnJvcik7XG4gICAgdGhpcy5lcnJvclN1YmplY3QubmV4dChlcnJvcik7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBmaW5nZXJwcmludCBhcyBhIHByb21pc2VcbiAgICovXG4gIGFzeW5jIGdldEZpbmdlcnByaW50KCk6IFByb21pc2U8RmluZ2VycHJpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5maW5nZXJwcmludFN1YmplY3QudmFsdWU7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIGZpbmdlcnByaW50IHRvIGJlIGxvYWRlZFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmZpbmdlcnByaW50JC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZmluZ2VycHJpbnQpID0+IHtcbiAgICAgICAgICBpZiAoZmluZ2VycHJpbnQpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZShmaW5nZXJwcmludCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYW4gZXZlbnRcbiAgICovXG4gIGFzeW5jIHRyYWNrRXZlbnQoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8VHJhY2tpbmdSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJhY2VUYWlsIGRvZXNuJ3QgaGF2ZSBhIHRyYWNrIG1ldGhvZCAtIHRoaXMgaXMgY3VzdG9tIGFwcCBmdW5jdGlvbmFsaXR5XG4gICAgICAvLyBGb3Igbm93LCBqdXN0IHJldHVybiBtb2NrIGRhdGEgd2l0aCBhIGdlbmVyYXRlZCBldmVudCBJRFxuICAgICAgY29uc3QgZXZlbnRJZCA9IGBldnRfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBmcmF1ZHVsZW50OiBmYWxzZSxcbiAgICAgICAgcmlza1Njb3JlOiAwLFxuICAgICAgICBldmVudElkOiBldmVudElkXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdUcmFjayBldmVudCBlcnJvcjonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGZyYXVkXG4gICAqL1xuICBhc3luYyBjaGVja0ZyYXVkKGRhdGE6IGFueSk6IFByb21pc2U8RnJhdWRSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmluZ2VycHJpbnQgPSBhd2FpdCB0aGlzLmdldEZpbmdlcnByaW50KCk7XG4gICAgICBcbiAgICAgIC8vIFNpbXBsZSBmcmF1ZCBkZXRlY3Rpb24gbG9naWMgYmFzZWQgb24gcmlzayBzY29yZVxuICAgICAgY29uc3QgYmxvY2sgPSBmaW5nZXJwcmludC5yaXNrU2NvcmUgPiAwLjg7XG4gICAgICBjb25zdCBjaGFsbGVuZ2UgPSBmaW5nZXJwcmludC5yaXNrU2NvcmUgPiAwLjUgJiYgZmluZ2VycHJpbnQucmlza1Njb3JlIDw9IDAuODtcbiAgICAgIGNvbnN0IGFsbG93ID0gZmluZ2VycHJpbnQucmlza1Njb3JlIDw9IDAuNTtcbiAgICAgIFxuICAgICAgY29uc3QgcmVhc29uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBmaW5nZXJwcmludC5zaWduYWxzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgaWYgKHNpZ25hbHM/LnZwbikgcmVhc29ucy5wdXNoKCdWUE4gZGV0ZWN0ZWQnKTtcbiAgICAgIGlmIChzaWduYWxzPy50b3IpIHJlYXNvbnMucHVzaCgnVG9yIGJyb3dzZXIgZGV0ZWN0ZWQnKTtcbiAgICAgIGlmIChzaWduYWxzPy5wcm94eSkgcmVhc29ucy5wdXNoKCdQcm94eSBkZXRlY3RlZCcpO1xuICAgICAgaWYgKGZpbmdlcnByaW50LnJpc2tTY29yZSA+IDAuNykgcmVhc29ucy5wdXNoKCdIaWdoIHJpc2sgc2NvcmUnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmxvY2ssXG4gICAgICAgIGNoYWxsZW5nZSxcbiAgICAgICAgYWxsb3csXG4gICAgICAgIHJpc2tTY29yZTogZmluZ2VycHJpbnQucmlza1Njb3JlLFxuICAgICAgICByZWFzb25zXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGcmF1ZCBjaGVjayBlcnJvcjonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cnkgZmluZ2VycHJpbnRpbmdcbiAgICovXG4gIHJldHJ5KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEZpbmdlcnByaW50KCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgcmVmcmVzaCBmaW5nZXJwcmludFxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRGaW5nZXJwcmludCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByYXcgVHJhY2VUYWlsIGNsaWVudCBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IFRyYWNlVGFpbCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50O1xuICB9XG59Il19
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2V0YWlsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYWNldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQXdCLE1BQU0sTUFBTSxDQUFDO0FBRTdELE9BQU8sU0FBUyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFXdEQsTUFBTSxPQUFPLGdCQUFnQjtJQVVtQjtJQVR0QyxNQUFNLENBQVk7SUFDbEIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO0lBQ25FLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNwRCxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLENBQUM7SUFFL0QsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUxQyxZQUE4QyxNQUF1QjtRQUF2QixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUk7WUFDRixtQkFBbUI7WUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUMvRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO29C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YmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHNoYXJlUmVwbGF5LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgVHJhY2VUYWlsIGZyb20gJ0B0cmFjZXRhaWwvanMnO1xuaW1wb3J0IHsgVFJBQ0VUQUlMX0NPTkZJRyB9IGZyb20gJy4vdHJhY2V0YWlsLmNvbmZpZyc7XG5pbXBvcnQgeyBcbiAgVHJhY2VUYWlsQ29uZmlnLCBcbiAgRmluZ2VycHJpbnQsIFxuICBUcmFja2luZ1Jlc3VsdCwgXG4gIEZyYXVkUmVzdWx0IFxufSBmcm9tICcuL3RyYWNldGFpbC50eXBlcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRyYWNlVGFpbFNlcnZpY2Uge1xuICBwcml2YXRlIGNsaWVudDogVHJhY2VUYWlsO1xuICBwcml2YXRlIGZpbmdlcnByaW50U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmluZ2VycHJpbnQgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBsb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByaXZhdGUgZXJyb3JTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFcnJvciB8IG51bGw+KG51bGwpO1xuXG4gIGZpbmdlcnByaW50JCA9IHRoaXMuZmluZ2VycHJpbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBsb2FkaW5nJCA9IHRoaXMubG9hZGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGVycm9yJCA9IHRoaXMuZXJyb3JTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoVFJBQ0VUQUlMX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRyYWNlVGFpbENvbmZpZykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNsaWVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2xpZW50KCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgdGVzdCBtb2RlXG4gICAgICBpZiAodGhpcy5jb25maWcuY29uZmlnPy50ZXN0TW9kZSAmJiB0aGlzLmNvbmZpZy5jb25maWcubW9ja0RhdGEpIHtcbiAgICAgICAgdGhpcy5maW5nZXJwcmludFN1YmplY3QubmV4dCh7XG4gICAgICAgICAgdmlzaXRvcklkOiAnbW9jay12aXNpdG9yLTEyMycsXG4gICAgICAgICAgY29uZmlkZW5jZTogMC45OSxcbiAgICAgICAgICByaXNrU2NvcmU6IDAuMSxcbiAgICAgICAgICBmcmF1ZHVsZW50OiBmYWxzZSxcbiAgICAgICAgICBzaWduYWxzOiB7fSxcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgLi4udGhpcy5jb25maWcuY29uZmlnLm1vY2tEYXRhXG4gICAgICAgIH0gYXMgRmluZ2VycHJpbnQpO1xuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWxpemUgcmVhbCBjbGllbnQuIFBhc3MgdGhyb3VnaCBlbmRwb2ludCBzbyBhIGN1c3RvbSBjb25maWcuZW5kcG9pbnQgaXNcbiAgICAgIC8vIGhvbm9yZWQgKHByZXZpb3VzbHkgZHJvcHBlZCwgc28gaXQgYWx3YXlzIGRlZmF1bHRlZCB0byAnL2FwaScpLlxuICAgICAgdGhpcy5jbGllbnQgPSBuZXcgVHJhY2VUYWlsKHtcbiAgICAgICAgYXBpS2V5OiB0aGlzLmNvbmZpZy5hcGlLZXksXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLmNvbmZpZz8udGltZW91dCxcbiAgICAgICAgZGVidWc6IHRoaXMuY29uZmlnLmNvbmZpZz8uZGVidWcgfHwgZmFsc2UsXG4gICAgICAgIC4uLih0aGlzLmNvbmZpZy5jb25maWc/LmVuZHBvaW50ID8geyBlbmRwb2ludDogdGhpcy5jb25maWcuY29uZmlnLmVuZHBvaW50IH0gOiB7fSlcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgaW5pdGlhbCBmaW5nZXJwcmludFxuICAgICAgdGhpcy5sb2FkRmluZ2VycHJpbnQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmluZ2VycHJpbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIHRoaXMuZXJyb3JTdWJqZWN0Lm5leHQobnVsbCk7XG5cbiAgICAgIC8vIFVzZSB2ZXJib3NlOiB0cnVlIHRvIGdldCBjb21wb25lbnRzIGluIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jbGllbnQuZ2VuZXJhdGVGaW5nZXJwcmludCh7IHZlcmJvc2U6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGZpbmdlcnByaW50OiBGaW5nZXJwcmludCA9IHtcbiAgICAgICAgdmlzaXRvcklkOiByZXN1bHQudmlzaXRvcklkLFxuICAgICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcbiAgICAgICAgcmlza1Njb3JlOiAwLCAgLy8gRGVmYXVsdCB2YWx1ZSAtIG5vdCBpbiBiYXNlIFNES1xuICAgICAgICBmcmF1ZHVsZW50OiBmYWxzZSwgIC8vIERlZmF1bHQgdmFsdWUgLSBub3QgaW4gYmFzZSBTREtcbiAgICAgICAgc2lnbmFsczogcmVzdWx0LmNvbXBvbmVudHMgfHwge30sXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgcHJvY2Vzc2luZ1RpbWU6IHJlc3VsdC5wcm9jZXNzaW5nVGltZVxuICAgICAgfTtcblxuICAgICAgdGhpcy5maW5nZXJwcmludFN1YmplY3QubmV4dChmaW5nZXJwcmludCk7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RyYWNlVGFpbCBlcnJvcjonLCBlcnJvcik7XG4gICAgdGhpcy5lcnJvclN1YmplY3QubmV4dChlcnJvcik7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBmaW5nZXJwcmludCBhcyBhIHByb21pc2VcbiAgICovXG4gIGFzeW5jIGdldEZpbmdlcnByaW50KCk6IFByb21pc2U8RmluZ2VycHJpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5maW5nZXJwcmludFN1YmplY3QudmFsdWU7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIGZpbmdlcnByaW50IHRvIGJlIGxvYWRlZFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmZpbmdlcnByaW50JC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZmluZ2VycHJpbnQpID0+IHtcbiAgICAgICAgICBpZiAoZmluZ2VycHJpbnQpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZShmaW5nZXJwcmludCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYW4gZXZlbnRcbiAgICovXG4gIGFzeW5jIHRyYWNrRXZlbnQoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8VHJhY2tpbmdSZXN1bHQ+IHtcbiAgICBjb25zb2xlLndhcm4oJ1tUcmFjZVRhaWxdIHRyYWNrRXZlbnQoKSB3YXMgY2FsbGVkIHdpdGg6JywgeyBldmVudCwgZGF0YSB9KTtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdbVHJhY2VUYWlsXSBFdmVudCB0cmFja2luZyBpcyBub3QgaW1wbGVtZW50ZWQgaW4gQHRyYWNldGFpbC9hbmd1bGFyLiBVc2UgZ2V0RmluZ2VycHJpbnQoKSB0byBjb2xsZWN0IHZpc2l0b3JJZC9yZXF1ZXN0SWQsIHRoZW4gc2VuZCB5b3VyIGV2ZW50IHRvIHlvdXIgb3duIGJhY2tlbmQgb3IgYW5hbHl0aWNzIHBpcGVsaW5lLidcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBmcmF1ZFxuICAgKi9cbiAgYXN5bmMgY2hlY2tGcmF1ZChkYXRhOiBhbnkpOiBQcm9taXNlPEZyYXVkUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbmdlcnByaW50ID0gYXdhaXQgdGhpcy5nZXRGaW5nZXJwcmludCgpO1xuICAgICAgXG4gICAgICAvLyBTaW1wbGUgZnJhdWQgZGV0ZWN0aW9uIGxvZ2ljIGJhc2VkIG9uIHJpc2sgc2NvcmVcbiAgICAgIGNvbnN0IGJsb2NrID0gZmluZ2VycHJpbnQucmlza1Njb3JlID4gMC44O1xuICAgICAgY29uc3QgY2hhbGxlbmdlID0gZmluZ2VycHJpbnQucmlza1Njb3JlID4gMC41ICYmIGZpbmdlcnByaW50LnJpc2tTY29yZSA8PSAwLjg7XG4gICAgICBjb25zdCBhbGxvdyA9IGZpbmdlcnByaW50LnJpc2tTY29yZSA8PSAwLjU7XG4gICAgICBcbiAgICAgIGNvbnN0IHJlYXNvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBzaWduYWxzID0gZmluZ2VycHJpbnQuc2lnbmFscyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGlmIChzaWduYWxzPy52cG4pIHJlYXNvbnMucHVzaCgnVlBOIGRldGVjdGVkJyk7XG4gICAgICBpZiAoc2lnbmFscz8udG9yKSByZWFzb25zLnB1c2goJ1RvciBicm93c2VyIGRldGVjdGVkJyk7XG4gICAgICBpZiAoc2lnbmFscz8ucHJveHkpIHJlYXNvbnMucHVzaCgnUHJveHkgZGV0ZWN0ZWQnKTtcbiAgICAgIGlmIChmaW5nZXJwcmludC5yaXNrU2NvcmUgPiAwLjcpIHJlYXNvbnMucHVzaCgnSGlnaCByaXNrIHNjb3JlJyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJsb2NrLFxuICAgICAgICBjaGFsbGVuZ2UsXG4gICAgICAgIGFsbG93LFxuICAgICAgICByaXNrU2NvcmU6IGZpbmdlcnByaW50LnJpc2tTY29yZSxcbiAgICAgICAgcmVhc29uc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRnJhdWQgY2hlY2sgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJ5IGZpbmdlcnByaW50aW5nXG4gICAqL1xuICByZXRyeSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRGaW5nZXJwcmludCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJlZnJlc2ggZmluZ2VycHJpbnRcbiAgICovXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkRmluZ2VycHJpbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmF3IFRyYWNlVGFpbCBjbGllbnQgaW5zdGFuY2VcbiAgICovXG4gIGdldENsaWVudCgpOiBUcmFjZVRhaWwge1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxufSJdfQ==
@@ -46,11 +46,13 @@ class TraceTailService {
46
46
  this.loadingSubject.next(false);
47
47
  return;
48
48
  }
49
- // Initialize real client
49
+ // Initialize real client. Pass through endpoint so a custom config.endpoint is
50
+ // honored (previously dropped, so it always defaulted to '/api').
50
51
  this.client = new TraceTail({
51
52
  apiKey: this.config.apiKey,
52
53
  timeout: this.config.config?.timeout,
53
- debug: this.config.config?.debug || false
54
+ debug: this.config.config?.debug || false,
55
+ ...(this.config.config?.endpoint ? { endpoint: this.config.config.endpoint } : {})
54
56
  });
55
57
  // Get initial fingerprint
56
58
  this.loadFingerprint();
@@ -114,21 +116,8 @@ class TraceTailService {
114
116
  * Track an event
115
117
  */
116
118
  async trackEvent(event, data) {
117
- try {
118
- // TraceTail doesn't have a track method - this is custom app functionality
119
- // For now, just return mock data with a generated event ID
120
- const eventId = `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
121
- return {
122
- success: true,
123
- fraudulent: false,
124
- riskScore: 0,
125
- eventId: eventId
126
- };
127
- }
128
- catch (error) {
129
- console.error('Track event error:', error);
130
- throw error;
131
- }
119
+ console.warn('[TraceTail] trackEvent() was called with:', { event, data });
120
+ throw new Error('[TraceTail] Event tracking is not implemented in @tracetail/angular. Use getFingerprint() to collect visitorId/requestId, then send your event to your own backend or analytics pipeline.');
132
121
  }
133
122
  /**
134
123
  * Check for fraud
@@ -1 +1 @@
1
- {"version":3,"file":"tracetail-angular.mjs","sources":["../../src/lib/tracetail.config.ts","../../src/lib/tracetail.service.ts","../../src/lib/directives/fraud-detection.directive.ts","../../src/lib/interceptors/tracetail.interceptor.ts","../../src/lib/tracetail.module.ts","../../src/lib/tracetail.types.ts","../../src/lib/guards/fraud-protection.guard.ts","../../src/public-api.ts","../../src/tracetail-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { TraceTailConfig } from './tracetail.types';\n\nexport const TRACETAIL_CONFIG = new InjectionToken<TraceTailConfig>('TRACETAIL_CONFIG');\n\nexport const DEFAULT_CONFIG: Partial<TraceTailConfig> = {\n config: {\n enhanced: true,\n timeout: 5000,\n endpoint: 'https://api.tracetail.com',\n testMode: false\n }\n};","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable, from, of } from 'rxjs';\nimport { catchError, shareReplay, tap } from 'rxjs/operators';\nimport TraceTail from '@tracetail/js';\nimport { TRACETAIL_CONFIG } from './tracetail.config';\nimport { \n TraceTailConfig, \n Fingerprint, \n TrackingResult, \n FraudResult \n} from './tracetail.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TraceTailService {\n private client: TraceTail;\n private fingerprintSubject = new BehaviorSubject<Fingerprint | null>(null);\n private loadingSubject = new BehaviorSubject<boolean>(true);\n private errorSubject = new BehaviorSubject<Error | null>(null);\n\n fingerprint$ = this.fingerprintSubject.asObservable();\n loading$ = this.loadingSubject.asObservable();\n error$ = this.errorSubject.asObservable();\n\n constructor(@Inject(TRACETAIL_CONFIG) private config: TraceTailConfig) {\n this.initializeClient();\n }\n\n private initializeClient(): void {\n try {\n // Handle test mode\n if (this.config.config?.testMode && this.config.config.mockData) {\n this.fingerprintSubject.next({\n visitorId: 'mock-visitor-123',\n confidence: 0.99,\n riskScore: 0.1,\n fraudulent: false,\n signals: {},\n timestamp: new Date(),\n ...this.config.config.mockData\n } as Fingerprint);\n this.loadingSubject.next(false);\n return;\n }\n\n // Initialize real client\n this.client = new TraceTail({\n apiKey: this.config.apiKey,\n timeout: this.config.config?.timeout,\n debug: this.config.config?.debug || false\n });\n\n // Get initial fingerprint\n this.loadFingerprint();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n private async loadFingerprint(): Promise<void> {\n try {\n this.loadingSubject.next(true);\n this.errorSubject.next(null);\n\n // Use verbose: true to get components in the response\n const result = await this.client.generateFingerprint({ verbose: true });\n\n const fingerprint: Fingerprint = {\n visitorId: result.visitorId,\n confidence: result.confidence,\n riskScore: 0, // Default value - not in base SDK\n fraudulent: false, // Default value - not in base SDK\n signals: result.components || {},\n timestamp: new Date(),\n processingTime: result.processingTime\n };\n\n this.fingerprintSubject.next(fingerprint);\n this.loadingSubject.next(false);\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n private handleError(error: Error): void {\n console.error('TraceTail error:', error);\n this.errorSubject.next(error);\n this.loadingSubject.next(false);\n }\n\n /**\n * Get current fingerprint as a promise\n */\n async getFingerprint(): Promise<Fingerprint> {\n const current = this.fingerprintSubject.value;\n if (current) {\n return current;\n }\n\n // Wait for fingerprint to be loaded\n return new Promise((resolve, reject) => {\n const subscription = this.fingerprint$.subscribe({\n next: (fingerprint) => {\n if (fingerprint) {\n subscription.unsubscribe();\n resolve(fingerprint);\n }\n },\n error: (error) => {\n subscription.unsubscribe();\n reject(error);\n }\n });\n });\n }\n\n /**\n * Track an event\n */\n async trackEvent(event: string, data?: any): Promise<TrackingResult> {\n try {\n // TraceTail doesn't have a track method - this is custom app functionality\n // For now, just return mock data with a generated event ID\n const eventId = `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n \n return {\n success: true,\n fraudulent: false,\n riskScore: 0,\n eventId: eventId\n };\n } catch (error) {\n console.error('Track event error:', error);\n throw error;\n }\n }\n\n /**\n * Check for fraud\n */\n async checkFraud(data: any): Promise<FraudResult> {\n try {\n const fingerprint = await this.getFingerprint();\n \n // Simple fraud detection logic based on risk score\n const block = fingerprint.riskScore > 0.8;\n const challenge = fingerprint.riskScore > 0.5 && fingerprint.riskScore <= 0.8;\n const allow = fingerprint.riskScore <= 0.5;\n \n const reasons: string[] = [];\n const signals = fingerprint.signals as Record<string, unknown>;\n if (signals?.vpn) reasons.push('VPN detected');\n if (signals?.tor) reasons.push('Tor browser detected');\n if (signals?.proxy) reasons.push('Proxy detected');\n if (fingerprint.riskScore > 0.7) reasons.push('High risk score');\n\n return {\n block,\n challenge,\n allow,\n riskScore: fingerprint.riskScore,\n reasons\n };\n } catch (error) {\n console.error('Fraud check error:', error);\n throw error;\n }\n }\n\n /**\n * Retry fingerprinting\n */\n retry(): void {\n this.loadFingerprint();\n }\n\n /**\n * Force refresh fingerprint\n */\n async refresh(): Promise<void> {\n await this.loadFingerprint();\n }\n\n /**\n * Get raw TraceTail client instance\n */\n getClient(): TraceTail {\n return this.client;\n }\n}","import { \n Directive, \n Input, \n ElementRef, \n OnInit, \n OnDestroy \n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { TraceTailService } from '../tracetail.service';\n\n@Directive({\n selector: '[appFraudDetection]'\n})\nexport class FraudDetectionDirective implements OnInit, OnDestroy {\n @Input() appFraudDetection: 'low' | 'medium' | 'high' = 'medium';\n @Input() disableOnRisk = true;\n @Input() cssClass = 'high-risk';\n\n private subscription: Subscription | null = null;\n\n constructor(\n private el: ElementRef<HTMLElement>,\n private traceTail: TraceTailService\n ) {}\n\n ngOnInit(): void {\n this.subscription = this.traceTail.fingerprint$.subscribe(fingerprint => {\n if (!fingerprint) return;\n\n const thresholds = {\n low: 0.3,\n medium: 0.5,\n high: 0.7\n };\n\n const threshold = thresholds[this.appFraudDetection];\n const isHighRisk = fingerprint.riskScore > threshold;\n\n // Apply or remove CSS class\n if (isHighRisk) {\n this.el.nativeElement.classList.add(this.cssClass);\n \n // Optionally disable the element\n if (this.disableOnRisk && this.isFormElement()) {\n this.el.nativeElement.setAttribute('disabled', 'true');\n this.el.nativeElement.setAttribute('title', 'High fraud risk detected');\n }\n } else {\n this.el.nativeElement.classList.remove(this.cssClass);\n \n if (this.disableOnRisk && this.isFormElement()) {\n this.el.nativeElement.removeAttribute('disabled');\n this.el.nativeElement.removeAttribute('title');\n }\n }\n\n // Emit custom event\n this.el.nativeElement.dispatchEvent(new CustomEvent('fraudStatusChange', {\n detail: {\n isHighRisk,\n riskScore: fingerprint.riskScore,\n threshold\n },\n bubbles: true\n }));\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n private isFormElement(): boolean {\n const tagName = this.el.nativeElement.tagName.toLowerCase();\n return ['input', 'button', 'select', 'textarea', 'form'].includes(tagName);\n }\n}","import { Injectable } from '@angular/core';\nimport {\n HttpInterceptor,\n HttpRequest,\n HttpHandler,\n HttpEvent\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { switchMap, take } from 'rxjs/operators';\nimport { TraceTailService } from '../tracetail.service';\n\n@Injectable()\nexport class TraceTailInterceptor implements HttpInterceptor {\n constructor(private traceTail: TraceTailService) {}\n\n intercept(\n req: HttpRequest<any>, \n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n // Skip TraceTail API requests to prevent circular dependency\n if (req.url.includes('api.tracetail.com')) {\n return next.handle(req);\n }\n\n return this.traceTail.fingerprint$.pipe(\n take(1),\n switchMap(fingerprint => {\n // Clone the request and add TraceTail headers\n const modifiedReq = req.clone({\n headers: req.headers\n .set('X-TraceTail-Visitor-ID', fingerprint?.visitorId || 'unknown')\n .set('X-TraceTail-Risk-Score', fingerprint?.riskScore?.toString() || '0')\n .set('X-TraceTail-Confidence', fingerprint?.confidence?.toString() || '0')\n });\n\n return next.handle(modifiedReq);\n })\n );\n }\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { TraceTailService } from './tracetail.service';\nimport { TraceTailConfig } from './tracetail.types';\nimport { TRACETAIL_CONFIG, DEFAULT_CONFIG } from './tracetail.config';\nimport { FraudDetectionDirective } from './directives/fraud-detection.directive';\nimport { TraceTailInterceptor } from './interceptors/tracetail.interceptor';\n\n@NgModule({\n declarations: [\n FraudDetectionDirective\n ],\n imports: [\n CommonModule\n ],\n exports: [\n FraudDetectionDirective\n ]\n})\nexport class TraceTailModule {\n static forRoot(config: TraceTailConfig): ModuleWithProviders<TraceTailModule> {\n return {\n ngModule: TraceTailModule,\n providers: [\n {\n provide: TRACETAIL_CONFIG,\n useValue: { ...DEFAULT_CONFIG, ...config }\n },\n TraceTailService,\n {\n provide: HTTP_INTERCEPTORS,\n useClass: TraceTailInterceptor,\n multi: true\n }\n ]\n };\n }\n\n static forFeature(config?: Partial<TraceTailConfig>): ModuleWithProviders<TraceTailModule> {\n return {\n ngModule: TraceTailModule,\n providers: config ? [\n {\n provide: TRACETAIL_CONFIG,\n useValue: { ...DEFAULT_CONFIG, ...config }\n }\n ] : []\n };\n }\n}","/**\n * TraceTail types for Angular\n */\n\nexport interface Fingerprint {\n visitorId: string;\n confidence: number;\n riskScore: number;\n fraudulent: boolean;\n signals: unknown;\n timestamp: Date;\n processingTime?: number;\n}\n\nexport interface SignalData {\n browser: string;\n os: string;\n device: string;\n screen: {\n width: number;\n height: number;\n colorDepth: number;\n };\n timezone: string;\n language: string;\n plugins: string[];\n fonts: string[];\n canvas: string;\n webgl: string;\n audio: string;\n vpn: boolean;\n tor: boolean;\n proxy: boolean;\n}\n\nexport interface TrackingResult {\n success: boolean;\n fraudulent: boolean;\n riskScore: number;\n eventId: string;\n}\n\nexport interface FraudResult {\n block: boolean;\n challenge: boolean;\n allow: boolean;\n riskScore: number;\n reasons: string[];\n}\n\nexport interface TraceTailConfig {\n apiKey: string;\n config?: {\n enhanced?: boolean;\n timeout?: number;\n endpoint?: string;\n debug?: boolean;\n testMode?: boolean;\n mockData?: Partial<Fingerprint>;\n };\n}","import { Injectable } from '@angular/core';\nimport {\n CanActivate,\n ActivatedRouteSnapshot,\n RouterStateSnapshot,\n Router,\n UrlTree\n} from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\nimport { TraceTailService } from '../tracetail.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FraudProtectionGuard implements CanActivate {\n constructor(\n private traceTail: TraceTailService,\n private router: Router\n ) {}\n\n canActivate(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n ): Observable<boolean | UrlTree> {\n // Get risk threshold from route data or use default\n const maxRiskScore = route.data['maxRiskScore'] ?? 0.7;\n const verificationUrl = route.data['verificationUrl'] ?? '/verify';\n\n return this.traceTail.fingerprint$.pipe(\n take(1),\n map(fingerprint => {\n if (!fingerprint) {\n // No fingerprint yet, allow but monitor\n console.warn('No fingerprint available for fraud check');\n return true;\n }\n\n // Check if user is fraudulent or high risk\n if (fingerprint.fraudulent || fingerprint.riskScore > maxRiskScore) {\n console.warn('High risk user blocked:', {\n visitorId: fingerprint.visitorId,\n riskScore: fingerprint.riskScore,\n fraudulent: fingerprint.fraudulent\n });\n\n // Redirect to verification page\n return this.router.createUrlTree([verificationUrl], {\n queryParams: {\n reason: fingerprint.fraudulent ? 'fraud' : 'risk',\n returnUrl: state.url\n }\n });\n }\n\n // User is safe, allow access\n return true;\n })\n );\n }\n}","/**\n * Public API Surface of @tracetail/angular\n */\n\nexport * from './lib/tracetail.module';\nexport * from './lib/tracetail.service';\nexport * from './lib/tracetail.config';\nexport * from './lib/tracetail.types';\nexport * from './lib/directives/fraud-detection.directive';\nexport * from './lib/interceptors/tracetail.interceptor';\nexport * from './lib/guards/fraud-protection.guard';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TraceTailService"],"mappings":";;;;;;;;;MAGa,gBAAgB,GAAG,IAAI,cAAc,CAAkB,kBAAkB;AAE/E,MAAM,cAAc,GAA6B;AACtD,IAAA,MAAM,EAAE;AACN,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,QAAQ,EAAE,2BAA2B;AACrC,QAAA,QAAQ,EAAE;AACX;;;MCIU,gBAAgB,CAAA;AAUmB,IAAA,MAAA;AATtC,IAAA,MAAM;AACN,IAAA,kBAAkB,GAAG,IAAI,eAAe,CAAqB,IAAI,CAAC;AAClE,IAAA,cAAc,GAAG,IAAI,eAAe,CAAU,IAAI,CAAC;AACnD,IAAA,YAAY,GAAG,IAAI,eAAe,CAAe,IAAI,CAAC;AAE9D,IAAA,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;AACrD,IAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;AAC7C,IAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;AAEzC,IAAA,WAAA,CAA8C,MAAuB,EAAA;QAAvB,IAAA,CAAA,MAAM,GAAN,MAAM;QAClD,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEQ,gBAAgB,GAAA;QACtB,IAAI;;AAEF,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;AAC/D,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAC3B,oBAAA,SAAS,EAAE,kBAAkB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE,GAAG;AACd,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,IAAI,IAAI,EAAE;AACrB,oBAAA,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AACR,iBAAA,CAAC;AACjB,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC/B;AACD,YAAA;;AAGD,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;AAC1B,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;AAC1B,gBAAA,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO;gBACpC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI;AACrC,aAAA,CAAC;;YAGF,IAAI,CAAC,eAAe,EAAE;AACvB,QAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,KAAc,CAAC;AACjC,QAAA;IACH;AAEQ,IAAA,MAAM,eAAe,GAAA;QAC3B,IAAI;AACF,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;AAG5B,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAEvE,YAAA,MAAM,WAAW,GAAgB;gBAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;AAC7B,gBAAA,SAAS,EAAE,CAAC;AACZ,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,OAAO,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;gBAChC,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,cAAc,EAAE,MAAM,CAAC;aACxB;AAED,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AACzC,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,QAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,KAAc,CAAC;AACjC,QAAA;IACH;AAEQ,IAAA,WAAW,CAAC,KAAY,EAAA;AAC9B,QAAA,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IACjC;AAEA;;AAEG;AACH,IAAA,MAAM,cAAc,GAAA;AAClB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK;AAC7C,QAAA,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,OAAO;AACf,QAAA;;QAGD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;AAC/C,gBAAA,IAAI,EAAE,CAAC,WAAW,KAAI;AACpB,oBAAA,IAAI,WAAW,EAAE;wBACf,YAAY,CAAC,WAAW,EAAE;wBAC1B,OAAO,CAAC,WAAW,CAAC;AACrB,oBAAA;gBACH,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;oBACf,YAAY,CAAC,WAAW,EAAE;oBAC1B,MAAM,CAAC,KAAK,CAAC;gBACf;AACD,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,MAAM,UAAU,CAAC,KAAa,EAAE,IAAU,EAAA;QACxC,IAAI;;;YAGF,MAAM,OAAO,GAAG,CAAA,IAAA,EAAO,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE;YAE9E,OAAO;AACL,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,SAAS,EAAE,CAAC;AACZ,gBAAA,OAAO,EAAE;aACV;AACF,QAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;AAC1C,YAAA,MAAM,KAAK;AACZ,QAAA;IACH;AAEA;;AAEG;IACH,MAAM,UAAU,CAAC,IAAS,EAAA;QACxB,IAAI;AACF,YAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;;AAG/C,YAAA,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,GAAG,GAAG;AACzC,YAAA,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,GAAG,GAAG,IAAI,WAAW,CAAC,SAAS,IAAI,GAAG;AAC7E,YAAA,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,IAAI,GAAG;YAE1C,MAAM,OAAO,GAAa,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,OAAkC;YAC9D,IAAI,OAAO,EAAE,GAAG;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;YAC9C,IAAI,OAAO,EAAE,GAAG;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;YACtD,IAAI,OAAO,EAAE,KAAK;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAClD,YAAA,IAAI,WAAW,CAAC,SAAS,GAAG,GAAG;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAEhE,OAAO;gBACL,KAAK;gBACL,SAAS;gBACT,KAAK;gBACL,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC;aACD;AACF,QAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;AAC1C,YAAA,MAAM,KAAK;AACZ,QAAA;IACH;AAEA;;AAEG;IACH,KAAK,GAAA;QACH,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA;;AAEG;AACH,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE;IAC9B;AAEA;;AAEG;IACH,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;AA9KW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,kBAUP,gBAAgB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAVzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAWc,MAAM;2BAAC,gBAAgB;;;MCZzB,uBAAuB,CAAA;AAQxB,IAAA,EAAA;AACA,IAAA,SAAA;IARD,iBAAiB,GAA8B,QAAQ;IACvD,aAAa,GAAG,IAAI;IACpB,QAAQ,GAAG,WAAW;IAEvB,YAAY,GAAwB,IAAI;IAEhD,WAAA,CACU,EAA2B,EAC3B,SAA2B,EAAA;QAD3B,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,SAAS,GAAT,SAAS;IAChB;IAEH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,IAAG;AACtE,YAAA,IAAI,CAAC,WAAW;gBAAE;AAElB,YAAA,MAAM,UAAU,GAAG;AACjB,gBAAA,GAAG,EAAE,GAAG;AACR,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,IAAI,EAAE;aACP;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpD,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,GAAG,SAAS;;AAGpD,YAAA,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;;gBAGlD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;oBAC9C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC;oBACtD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,0BAA0B,CAAC;AACxE,gBAAA;AACF,YAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAErD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;oBAC9C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC;oBACjD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC;AAC/C,gBAAA;AACF,YAAA;;YAGD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE;AACvE,gBAAA,MAAM,EAAE;oBACN,UAAU;oBACV,SAAS,EAAE,WAAW,CAAC,SAAS;oBAChC;AACD,iBAAA;AACD,gBAAA,OAAO,EAAE;AACV,aAAA,CAAC,CAAC;AACL,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAChC,QAAA;IACH;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE;AAC3D,QAAA,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC5E;wGAhEW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE;AACX,iBAAA;2GAEU,iBAAiB,EAAA,CAAA;sBAAzB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;;;MCJU,oBAAoB,CAAA;AACX,IAAA,SAAA;AAApB,IAAA,WAAA,CAAoB,SAA2B,EAAA;QAA3B,IAAA,CAAA,SAAS,GAAT,SAAS;IAAqB;IAElD,SAAS,CACP,GAAqB,EACrB,IAAiB,EAAA;;QAGjB,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACxB,QAAA;AAED,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CACrC,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,WAAW,IAAG;;AAEtB,YAAA,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC;gBAC5B,OAAO,EAAE,GAAG,CAAC;qBACV,GAAG,CAAC,wBAAwB,EAAE,WAAW,EAAE,SAAS,IAAI,SAAS;qBACjE,GAAG,CAAC,wBAAwB,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG;qBACvE,GAAG,CAAC,wBAAwB,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,GAAG;AAC5E,aAAA,CAAC;AAEF,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACjC,CAAC,CAAC,CACH;IACH;wGA1BW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;MCSY,eAAe,CAAA;IAC1B,OAAO,OAAO,CAAC,MAAuB,EAAA;QACpC,OAAO;AACL,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,OAAO,EAAE,gBAAgB;AACzB,oBAAA,QAAQ,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM;AACzC,iBAAA;gBACD,gBAAgB;AAChB,gBAAA;AACE,oBAAA,OAAO,EAAE,iBAAiB;AAC1B,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,KAAK,EAAE;AACR;AACF;SACF;IACH;IAEA,OAAO,UAAU,CAAC,MAAiC,EAAA;QACjD,OAAO;AACL,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,SAAS,EAAE,MAAM,GAAG;AAClB,gBAAA;AACE,oBAAA,OAAO,EAAE,gBAAgB;AACzB,oBAAA,QAAQ,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM;AACzC;aACF,GAAG;SACL;IACH;wGA7BW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,CATxB,uBAAuB,CAAA,EAAA,OAAA,EAAA,CAGvB,YAAY,aAGZ,uBAAuB,CAAA,EAAA,CAAA;AAGd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,YANxB,YAAY,CAAA,EAAA,CAAA;;4FAMH,eAAe,EAAA,UAAA,EAAA,CAAA;kBAX3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ;AACD,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP;AACD,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP;AACD;AACF,iBAAA;;;ACnBD;;AAEG;;MCaU,oBAAoB,CAAA;AAErB,IAAA,SAAA;AACA,IAAA,MAAA;IAFV,WAAA,CACU,SAA2B,EAC3B,MAAc,EAAA;QADd,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;IAEH,WAAW,CACT,KAA6B,EAC7B,KAA0B,EAAA;;QAG1B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG;QACtD,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,SAAS;AAElE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CACrC,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,WAAW,IAAG;YAChB,IAAI,CAAC,WAAW,EAAE;;AAEhB,gBAAA,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC;AACxD,gBAAA,OAAO,IAAI;AACZ,YAAA;;YAGD,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,SAAS,GAAG,YAAY,EAAE;AAClE,gBAAA,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE;oBACtC,SAAS,EAAE,WAAW,CAAC,SAAS;oBAChC,SAAS,EAAE,WAAW,CAAC,SAAS;oBAChC,UAAU,EAAE,WAAW,CAAC;AACzB,iBAAA,CAAC;;gBAGF,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,EAAE;AAClD,oBAAA,WAAW,EAAE;wBACX,MAAM,EAAE,WAAW,CAAC,UAAU,GAAG,OAAO,GAAG,MAAM;wBACjD,SAAS,EAAE,KAAK,CAAC;AAClB;AACF,iBAAA,CAAC;AACH,YAAA;;AAGD,YAAA,OAAO,IAAI;QACb,CAAC,CAAC,CACH;IACH;wGA5CW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACdD;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"tracetail-angular.mjs","sources":["../../src/lib/tracetail.config.ts","../../src/lib/tracetail.service.ts","../../src/lib/directives/fraud-detection.directive.ts","../../src/lib/interceptors/tracetail.interceptor.ts","../../src/lib/tracetail.module.ts","../../src/lib/tracetail.types.ts","../../src/lib/guards/fraud-protection.guard.ts","../../src/public-api.ts","../../src/tracetail-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { TraceTailConfig } from './tracetail.types';\n\nexport const TRACETAIL_CONFIG = new InjectionToken<TraceTailConfig>('TRACETAIL_CONFIG');\n\nexport const DEFAULT_CONFIG: Partial<TraceTailConfig> = {\n config: {\n enhanced: true,\n timeout: 5000,\n endpoint: 'https://api.tracetail.com',\n testMode: false\n }\n};","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable, from, of } from 'rxjs';\nimport { catchError, shareReplay, tap } from 'rxjs/operators';\nimport TraceTail from '@tracetail/js';\nimport { TRACETAIL_CONFIG } from './tracetail.config';\nimport { \n TraceTailConfig, \n Fingerprint, \n TrackingResult, \n FraudResult \n} from './tracetail.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TraceTailService {\n private client: TraceTail;\n private fingerprintSubject = new BehaviorSubject<Fingerprint | null>(null);\n private loadingSubject = new BehaviorSubject<boolean>(true);\n private errorSubject = new BehaviorSubject<Error | null>(null);\n\n fingerprint$ = this.fingerprintSubject.asObservable();\n loading$ = this.loadingSubject.asObservable();\n error$ = this.errorSubject.asObservable();\n\n constructor(@Inject(TRACETAIL_CONFIG) private config: TraceTailConfig) {\n this.initializeClient();\n }\n\n private initializeClient(): void {\n try {\n // Handle test mode\n if (this.config.config?.testMode && this.config.config.mockData) {\n this.fingerprintSubject.next({\n visitorId: 'mock-visitor-123',\n confidence: 0.99,\n riskScore: 0.1,\n fraudulent: false,\n signals: {},\n timestamp: new Date(),\n ...this.config.config.mockData\n } as Fingerprint);\n this.loadingSubject.next(false);\n return;\n }\n\n // Initialize real client. Pass through endpoint so a custom config.endpoint is\n // honored (previously dropped, so it always defaulted to '/api').\n this.client = new TraceTail({\n apiKey: this.config.apiKey,\n timeout: this.config.config?.timeout,\n debug: this.config.config?.debug || false,\n ...(this.config.config?.endpoint ? { endpoint: this.config.config.endpoint } : {})\n });\n\n // Get initial fingerprint\n this.loadFingerprint();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n private async loadFingerprint(): Promise<void> {\n try {\n this.loadingSubject.next(true);\n this.errorSubject.next(null);\n\n // Use verbose: true to get components in the response\n const result = await this.client.generateFingerprint({ verbose: true });\n\n const fingerprint: Fingerprint = {\n visitorId: result.visitorId,\n confidence: result.confidence,\n riskScore: 0, // Default value - not in base SDK\n fraudulent: false, // Default value - not in base SDK\n signals: result.components || {},\n timestamp: new Date(),\n processingTime: result.processingTime\n };\n\n this.fingerprintSubject.next(fingerprint);\n this.loadingSubject.next(false);\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n private handleError(error: Error): void {\n console.error('TraceTail error:', error);\n this.errorSubject.next(error);\n this.loadingSubject.next(false);\n }\n\n /**\n * Get current fingerprint as a promise\n */\n async getFingerprint(): Promise<Fingerprint> {\n const current = this.fingerprintSubject.value;\n if (current) {\n return current;\n }\n\n // Wait for fingerprint to be loaded\n return new Promise((resolve, reject) => {\n const subscription = this.fingerprint$.subscribe({\n next: (fingerprint) => {\n if (fingerprint) {\n subscription.unsubscribe();\n resolve(fingerprint);\n }\n },\n error: (error) => {\n subscription.unsubscribe();\n reject(error);\n }\n });\n });\n }\n\n /**\n * Track an event\n */\n async trackEvent(event: string, data?: any): Promise<TrackingResult> {\n console.warn('[TraceTail] trackEvent() was called with:', { event, data });\n\n throw new Error(\n '[TraceTail] Event tracking is not implemented in @tracetail/angular. Use getFingerprint() to collect visitorId/requestId, then send your event to your own backend or analytics pipeline.'\n );\n }\n\n /**\n * Check for fraud\n */\n async checkFraud(data: any): Promise<FraudResult> {\n try {\n const fingerprint = await this.getFingerprint();\n \n // Simple fraud detection logic based on risk score\n const block = fingerprint.riskScore > 0.8;\n const challenge = fingerprint.riskScore > 0.5 && fingerprint.riskScore <= 0.8;\n const allow = fingerprint.riskScore <= 0.5;\n \n const reasons: string[] = [];\n const signals = fingerprint.signals as Record<string, unknown>;\n if (signals?.vpn) reasons.push('VPN detected');\n if (signals?.tor) reasons.push('Tor browser detected');\n if (signals?.proxy) reasons.push('Proxy detected');\n if (fingerprint.riskScore > 0.7) reasons.push('High risk score');\n\n return {\n block,\n challenge,\n allow,\n riskScore: fingerprint.riskScore,\n reasons\n };\n } catch (error) {\n console.error('Fraud check error:', error);\n throw error;\n }\n }\n\n /**\n * Retry fingerprinting\n */\n retry(): void {\n this.loadFingerprint();\n }\n\n /**\n * Force refresh fingerprint\n */\n async refresh(): Promise<void> {\n await this.loadFingerprint();\n }\n\n /**\n * Get raw TraceTail client instance\n */\n getClient(): TraceTail {\n return this.client;\n }\n}","import { \n Directive, \n Input, \n ElementRef, \n OnInit, \n OnDestroy \n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { TraceTailService } from '../tracetail.service';\n\n@Directive({\n selector: '[appFraudDetection]'\n})\nexport class FraudDetectionDirective implements OnInit, OnDestroy {\n @Input() appFraudDetection: 'low' | 'medium' | 'high' = 'medium';\n @Input() disableOnRisk = true;\n @Input() cssClass = 'high-risk';\n\n private subscription: Subscription | null = null;\n\n constructor(\n private el: ElementRef<HTMLElement>,\n private traceTail: TraceTailService\n ) {}\n\n ngOnInit(): void {\n this.subscription = this.traceTail.fingerprint$.subscribe(fingerprint => {\n if (!fingerprint) return;\n\n const thresholds = {\n low: 0.3,\n medium: 0.5,\n high: 0.7\n };\n\n const threshold = thresholds[this.appFraudDetection];\n const isHighRisk = fingerprint.riskScore > threshold;\n\n // Apply or remove CSS class\n if (isHighRisk) {\n this.el.nativeElement.classList.add(this.cssClass);\n \n // Optionally disable the element\n if (this.disableOnRisk && this.isFormElement()) {\n this.el.nativeElement.setAttribute('disabled', 'true');\n this.el.nativeElement.setAttribute('title', 'High fraud risk detected');\n }\n } else {\n this.el.nativeElement.classList.remove(this.cssClass);\n \n if (this.disableOnRisk && this.isFormElement()) {\n this.el.nativeElement.removeAttribute('disabled');\n this.el.nativeElement.removeAttribute('title');\n }\n }\n\n // Emit custom event\n this.el.nativeElement.dispatchEvent(new CustomEvent('fraudStatusChange', {\n detail: {\n isHighRisk,\n riskScore: fingerprint.riskScore,\n threshold\n },\n bubbles: true\n }));\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n private isFormElement(): boolean {\n const tagName = this.el.nativeElement.tagName.toLowerCase();\n return ['input', 'button', 'select', 'textarea', 'form'].includes(tagName);\n }\n}","import { Injectable } from '@angular/core';\nimport {\n HttpInterceptor,\n HttpRequest,\n HttpHandler,\n HttpEvent\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { switchMap, take } from 'rxjs/operators';\nimport { TraceTailService } from '../tracetail.service';\n\n@Injectable()\nexport class TraceTailInterceptor implements HttpInterceptor {\n constructor(private traceTail: TraceTailService) {}\n\n intercept(\n req: HttpRequest<any>, \n next: HttpHandler\n ): Observable<HttpEvent<any>> {\n // Skip TraceTail API requests to prevent circular dependency\n if (req.url.includes('api.tracetail.com')) {\n return next.handle(req);\n }\n\n return this.traceTail.fingerprint$.pipe(\n take(1),\n switchMap(fingerprint => {\n // Clone the request and add TraceTail headers\n const modifiedReq = req.clone({\n headers: req.headers\n .set('X-TraceTail-Visitor-ID', fingerprint?.visitorId || 'unknown')\n .set('X-TraceTail-Risk-Score', fingerprint?.riskScore?.toString() || '0')\n .set('X-TraceTail-Confidence', fingerprint?.confidence?.toString() || '0')\n });\n\n return next.handle(modifiedReq);\n })\n );\n }\n}","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\nimport { TraceTailService } from './tracetail.service';\nimport { TraceTailConfig } from './tracetail.types';\nimport { TRACETAIL_CONFIG, DEFAULT_CONFIG } from './tracetail.config';\nimport { FraudDetectionDirective } from './directives/fraud-detection.directive';\nimport { TraceTailInterceptor } from './interceptors/tracetail.interceptor';\n\n@NgModule({\n declarations: [\n FraudDetectionDirective\n ],\n imports: [\n CommonModule\n ],\n exports: [\n FraudDetectionDirective\n ]\n})\nexport class TraceTailModule {\n static forRoot(config: TraceTailConfig): ModuleWithProviders<TraceTailModule> {\n return {\n ngModule: TraceTailModule,\n providers: [\n {\n provide: TRACETAIL_CONFIG,\n useValue: { ...DEFAULT_CONFIG, ...config }\n },\n TraceTailService,\n {\n provide: HTTP_INTERCEPTORS,\n useClass: TraceTailInterceptor,\n multi: true\n }\n ]\n };\n }\n\n static forFeature(config?: Partial<TraceTailConfig>): ModuleWithProviders<TraceTailModule> {\n return {\n ngModule: TraceTailModule,\n providers: config ? [\n {\n provide: TRACETAIL_CONFIG,\n useValue: { ...DEFAULT_CONFIG, ...config }\n }\n ] : []\n };\n }\n}","/**\n * TraceTail types for Angular\n */\n\nexport interface Fingerprint {\n visitorId: string;\n confidence: number;\n riskScore: number;\n fraudulent: boolean;\n signals: unknown;\n timestamp: Date;\n processingTime?: number;\n}\n\nexport interface SignalData {\n browser: string;\n os: string;\n device: string;\n screen: {\n width: number;\n height: number;\n colorDepth: number;\n };\n timezone: string;\n language: string;\n plugins: string[];\n fonts: string[];\n canvas: string;\n webgl: string;\n audio: string;\n vpn: boolean;\n tor: boolean;\n proxy: boolean;\n}\n\nexport interface TrackingResult {\n success: boolean;\n fraudulent: boolean;\n riskScore: number;\n eventId: string;\n}\n\nexport interface FraudResult {\n block: boolean;\n challenge: boolean;\n allow: boolean;\n riskScore: number;\n reasons: string[];\n}\n\nexport interface TraceTailConfig {\n apiKey: string;\n config?: {\n enhanced?: boolean;\n timeout?: number;\n endpoint?: string;\n debug?: boolean;\n testMode?: boolean;\n mockData?: Partial<Fingerprint>;\n };\n}","import { Injectable } from '@angular/core';\nimport {\n CanActivate,\n ActivatedRouteSnapshot,\n RouterStateSnapshot,\n Router,\n UrlTree\n} from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\nimport { TraceTailService } from '../tracetail.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FraudProtectionGuard implements CanActivate {\n constructor(\n private traceTail: TraceTailService,\n private router: Router\n ) {}\n\n canActivate(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n ): Observable<boolean | UrlTree> {\n // Get risk threshold from route data or use default\n const maxRiskScore = route.data['maxRiskScore'] ?? 0.7;\n const verificationUrl = route.data['verificationUrl'] ?? '/verify';\n\n return this.traceTail.fingerprint$.pipe(\n take(1),\n map(fingerprint => {\n if (!fingerprint) {\n // No fingerprint yet, allow but monitor\n console.warn('No fingerprint available for fraud check');\n return true;\n }\n\n // Check if user is fraudulent or high risk\n if (fingerprint.fraudulent || fingerprint.riskScore > maxRiskScore) {\n console.warn('High risk user blocked:', {\n visitorId: fingerprint.visitorId,\n riskScore: fingerprint.riskScore,\n fraudulent: fingerprint.fraudulent\n });\n\n // Redirect to verification page\n return this.router.createUrlTree([verificationUrl], {\n queryParams: {\n reason: fingerprint.fraudulent ? 'fraud' : 'risk',\n returnUrl: state.url\n }\n });\n }\n\n // User is safe, allow access\n return true;\n })\n );\n }\n}","/**\n * Public API Surface of @tracetail/angular\n */\n\nexport * from './lib/tracetail.module';\nexport * from './lib/tracetail.service';\nexport * from './lib/tracetail.config';\nexport * from './lib/tracetail.types';\nexport * from './lib/directives/fraud-detection.directive';\nexport * from './lib/interceptors/tracetail.interceptor';\nexport * from './lib/guards/fraud-protection.guard';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TraceTailService"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracetail/angular",
3
- "version": "2.3.11",
3
+ "version": "2.3.13",
4
4
  "description": "Angular SDK for TraceTail browser fingerprinting - over 99.5% accuracy",
5
5
  "main": "dist/fesm2022/tracetail-angular.mjs",
6
6
  "module": "dist/fesm2022/tracetail-angular.mjs",
@@ -54,7 +54,7 @@
54
54
  "rxjs": "^7.0.0"
55
55
  },
56
56
  "dependencies": {
57
- "@tracetail/js": "^2.3.9"
57
+ "@tracetail/js": "^2.3.13"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@angular/common": "^17.0.0",