@tracetail/angular 2.3.6 → 2.3.8

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.
@@ -49,14 +49,16 @@ export class TraceTailService {
49
49
  try {
50
50
  this.loadingSubject.next(true);
51
51
  this.errorSubject.next(null);
52
- const result = await this.client.generateFingerprint();
52
+ // Use verbose: true to get components in the response
53
+ const result = await this.client.generateFingerprint({ verbose: true });
53
54
  const fingerprint = {
54
55
  visitorId: result.visitorId,
55
56
  confidence: result.confidence,
56
57
  riskScore: 0,
57
58
  fraudulent: false,
58
59
  signals: result.components || {},
59
- timestamp: new Date()
60
+ timestamp: new Date(),
61
+ processingTime: result.processingTime
60
62
  };
61
63
  this.fingerprintSubject.next(fingerprint);
62
64
  this.loadingSubject.next(false);
@@ -125,11 +127,12 @@ export class TraceTailService {
125
127
  const challenge = fingerprint.riskScore > 0.5 && fingerprint.riskScore <= 0.8;
126
128
  const allow = fingerprint.riskScore <= 0.5;
127
129
  const reasons = [];
128
- if (fingerprint.signals.vpn)
130
+ const signals = fingerprint.signals;
131
+ if (signals?.vpn)
129
132
  reasons.push('VPN detected');
130
- if (fingerprint.signals.tor)
133
+ if (signals?.tor)
131
134
  reasons.push('Tor browser detected');
132
- if (fingerprint.signals.proxy)
135
+ if (signals?.proxy)
133
136
  reasons.push('Proxy detected');
134
137
  if (fingerprint.riskScore > 0.7)
135
138
  reasons.push('High risk score');
@@ -176,4 +179,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
176
179
  type: Inject,
177
180
  args: [TRACETAIL_CONFIG]
178
181
  }] }] });
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2V0YWlsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYWNldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQXdCLE1BQU0sTUFBTSxDQUFDO0FBRTdELE9BQU8sU0FBUyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFXdEQsTUFBTSxPQUFPLGdCQUFnQjtJQVVtQjtJQVR0QyxNQUFNLENBQVk7SUFDbEIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO0lBQ25FLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNwRCxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLENBQUM7SUFFL0QsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUxQyxZQUE4QyxNQUF1QjtRQUF2QixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUk7WUFDRixtQkFBbUI7WUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUMvRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO29C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dGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHNoYXJlUmVwbGF5LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgVHJhY2VUYWlsIGZyb20gJ0B0cmFjZXRhaWwvanMnO1xuaW1wb3J0IHsgVFJBQ0VUQUlMX0NPTkZJRyB9IGZyb20gJy4vdHJhY2V0YWlsLmNvbmZpZyc7XG5pbXBvcnQgeyBcbiAgVHJhY2VUYWlsQ29uZmlnLCBcbiAgRmluZ2VycHJpbnQsIFxuICBUcmFja2luZ1Jlc3VsdCwgXG4gIEZyYXVkUmVzdWx0IFxufSBmcm9tICcuL3RyYWNldGFpbC50eXBlcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRyYWNlVGFpbFNlcnZpY2Uge1xuICBwcml2YXRlIGNsaWVudDogVHJhY2VUYWlsO1xuICBwcml2YXRlIGZpbmdlcnByaW50U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmluZ2VycHJpbnQgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBsb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByaXZhdGUgZXJyb3JTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFcnJvciB8IG51bGw+KG51bGwpO1xuXG4gIGZpbmdlcnByaW50JCA9IHRoaXMuZmluZ2VycHJpbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBsb2FkaW5nJCA9IHRoaXMubG9hZGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGVycm9yJCA9IHRoaXMuZXJyb3JTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoVFJBQ0VUQUlMX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRyYWNlVGFpbENvbmZpZykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNsaWVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2xpZW50KCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgdGVzdCBtb2RlXG4gICAgICBpZiAodGhpcy5jb25maWcuY29uZmlnPy50ZXN0TW9kZSAmJiB0aGlzLmNvbmZpZy5jb25maWcubW9ja0RhdGEpIHtcbiAgICAgICAgdGhpcy5maW5nZXJwcmludFN1YmplY3QubmV4dCh7XG4gICAgICAgICAgdmlzaXRvcklkOiAnbW9jay12aXNpdG9yLTEyMycsXG4gICAgICAgICAgY29uZmlkZW5jZTogMC45OSxcbiAgICAgICAgICByaXNrU2NvcmU6IDAuMSxcbiAgICAgICAgICBmcmF1ZHVsZW50OiBmYWxzZSxcbiAgICAgICAgICBzaWduYWxzOiB7fSBhcyBhbnksXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIC4uLnRoaXMuY29uZmlnLmNvbmZpZy5tb2NrRGF0YVxuICAgICAgICB9IGFzIEZpbmdlcnByaW50KTtcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHJlYWwgY2xpZW50XG4gICAgICB0aGlzLmNsaWVudCA9IG5ldyBUcmFjZVRhaWwoe1xuICAgICAgICBhcGlLZXk6IHRoaXMuY29uZmlnLmFwaUtleSxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWcuY29uZmlnPy50aW1lb3V0LFxuICAgICAgICBkZWJ1ZzogdGhpcy5jb25maWcuY29uZmlnPy5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCBpbml0aWFsIGZpbmdlcnByaW50XG4gICAgICB0aGlzLmxvYWRGaW5nZXJwcmludCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRGaW5nZXJwcmludCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5lcnJvclN1YmplY3QubmV4dChudWxsKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jbGllbnQuZ2VuZXJhdGVGaW5nZXJwcmludCgpO1xuICAgICAgXG4gICAgICBjb25zdCBmaW5nZXJwcmludDogRmluZ2VycHJpbnQgPSB7XG4gICAgICAgIHZpc2l0b3JJZDogcmVzdWx0LnZpc2l0b3JJZCxcbiAgICAgICAgY29uZmlkZW5jZTogcmVzdWx0LmNvbmZpZGVuY2UsXG4gICAgICAgIHJpc2tTY29yZTogMCwgIC8vIERlZmF1bHQgdmFsdWUgLSBub3QgaW4gYmFzZSBTREtcbiAgICAgICAgZnJhdWR1bGVudDogZmFsc2UsICAvLyBEZWZhdWx0IHZhbHVlIC0gbm90IGluIGJhc2UgU0RLICBcbiAgICAgICAgc2lnbmFsczogcmVzdWx0LmNvbXBvbmVudHMgfHwge30gYXMgYW55LFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZmluZ2VycHJpbnRTdWJqZWN0Lm5leHQoZmluZ2VycHJpbnQpO1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKCdUcmFjZVRhaWwgZXJyb3I6JywgZXJyb3IpO1xuICAgIHRoaXMuZXJyb3JTdWJqZWN0Lm5leHQoZXJyb3IpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgZmluZ2VycHJpbnQgYXMgYSBwcm9taXNlXG4gICAqL1xuICBhc3luYyBnZXRGaW5nZXJwcmludCgpOiBQcm9taXNlPEZpbmdlcnByaW50PiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZmluZ2VycHJpbnRTdWJqZWN0LnZhbHVlO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG5cbiAgICAvLyBXYWl0IGZvciBmaW5nZXJwcmludCB0byBiZSBsb2FkZWRcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5maW5nZXJwcmludCQuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGZpbmdlcnByaW50KSA9PiB7XG4gICAgICAgICAgaWYgKGZpbmdlcnByaW50KSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmluZ2VycHJpbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrIGFuIGV2ZW50XG4gICAqL1xuICBhc3luYyB0cmFja0V2ZW50KGV2ZW50OiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPFRyYWNraW5nUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyYWNlVGFpbCBkb2Vzbid0IGhhdmUgYSB0cmFjayBtZXRob2QgLSB0aGlzIGlzIGN1c3RvbSBhcHAgZnVuY3Rpb25hbGl0eVxuICAgICAgLy8gRm9yIG5vdywganVzdCByZXR1cm4gbW9jayBkYXRhIHdpdGggYSBnZW5lcmF0ZWQgZXZlbnQgSURcbiAgICAgIGNvbnN0IGV2ZW50SWQgPSBgZXZ0XyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZnJhdWR1bGVudDogZmFsc2UsXG4gICAgICAgIHJpc2tTY29yZTogMCxcbiAgICAgICAgZXZlbnRJZDogZXZlbnRJZFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVHJhY2sgZXZlbnQgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBmcmF1ZFxuICAgKi9cbiAgYXN5bmMgY2hlY2tGcmF1ZChkYXRhOiBhbnkpOiBQcm9taXNlPEZyYXVkUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbmdlcnByaW50ID0gYXdhaXQgdGhpcy5nZXRGaW5nZXJwcmludCgpO1xuICAgICAgXG4gICAgICAvLyBTaW1wbGUgZnJhdWQgZGV0ZWN0aW9uIGxvZ2ljIGJhc2VkIG9uIHJpc2sgc2NvcmVcbiAgICAgIGNvbnN0IGJsb2NrID0gZmluZ2VycHJpbnQucmlza1Njb3JlID4gMC44O1xuICAgICAgY29uc3QgY2hhbGxlbmdlID0gZmluZ2VycHJpbnQucmlza1Njb3JlID4gMC41ICYmIGZpbmdlcnByaW50LnJpc2tTY29yZSA8PSAwLjg7XG4gICAgICBjb25zdCBhbGxvdyA9IGZpbmdlcnByaW50LnJpc2tTY29yZSA8PSAwLjU7XG4gICAgICBcbiAgICAgIGNvbnN0IHJlYXNvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoZmluZ2VycHJpbnQuc2lnbmFscy52cG4pIHJlYXNvbnMucHVzaCgnVlBOIGRldGVjdGVkJyk7XG4gICAgICBpZiAoZmluZ2VycHJpbnQuc2lnbmFscy50b3IpIHJlYXNvbnMucHVzaCgnVG9yIGJyb3dzZXIgZGV0ZWN0ZWQnKTtcbiAgICAgIGlmIChmaW5nZXJwcmludC5zaWduYWxzLnByb3h5KSByZWFzb25zLnB1c2goJ1Byb3h5IGRldGVjdGVkJyk7XG4gICAgICBpZiAoZmluZ2VycHJpbnQucmlza1Njb3JlID4gMC43KSByZWFzb25zLnB1c2goJ0hpZ2ggcmlzayBzY29yZScpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBibG9jayxcbiAgICAgICAgY2hhbGxlbmdlLFxuICAgICAgICBhbGxvdyxcbiAgICAgICAgcmlza1Njb3JlOiBmaW5nZXJwcmludC5yaXNrU2NvcmUsXG4gICAgICAgIHJlYXNvbnNcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZyYXVkIGNoZWNrIGVycm9yOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyeSBmaW5nZXJwcmludGluZ1xuICAgKi9cbiAgcmV0cnkoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkRmluZ2VycHJpbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSByZWZyZXNoIGZpbmdlcnByaW50XG4gICAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubG9hZEZpbmdlcnByaW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJhdyBUcmFjZVRhaWwgY2xpZW50IGluc3RhbmNlXG4gICAqL1xuICBnZXRDbGllbnQoKTogVHJhY2VUYWlsIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cbn0iXX0=
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2V0YWlsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYWNldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQXdCLE1BQU0sTUFBTSxDQUFDO0FBRTdELE9BQU8sU0FBUyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFXdEQsTUFBTSxPQUFPLGdCQUFnQjtJQVVtQjtJQVR0QyxNQUFNLENBQVk7SUFDbEIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO0lBQ25FLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNwRCxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLENBQUM7SUFFL0QsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUxQyxZQUE4QyxNQUF1QjtRQUF2QixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUk7WUFDRixtQkFBbUI7WUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUMvRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO29CQUMzQixTQUFTLEVBQUUsa0JBQWtCO29CQUM3QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLE9BQU8sRUFBRSxFQUFFO29CQUNYLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtvQkFDckIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2lCQUNoQixDQUFDLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxPQUFPO2FBQ1I7WUFFRCx5QkFBeUI7WUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQztnQkFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU87Z0JBQ3BDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksS0FBSzthQUMxQyxDQUFDLENBQUM7WUFFSCwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQWMsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlO1FBQzNCLElBQUk7WUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3QixzREFBc0Q7WUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFeEUsTUFBTSxXQUFXLEdBQWdCO2dCQUMvQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzNCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDN0IsU0FBUyxFQUFFLENBQUM7Z0JBQ1osVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUU7Z0JBQ2hDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtnQkFDckIsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjO2FBQ3RDLENBQUM7WUFFRixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQWMsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFZO1FBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztRQUM5QyxJQUFJLE9BQU8sRUFBRTtZQUNYLE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBRUQsb0NBQW9DO1FBQ3BDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7Z0JBQy9DLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUNwQixJQUFJLFdBQVcsRUFBRTt3QkFDZixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQzNCLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDdEI7Z0JBQ0gsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBVTtRQUN4QyxJQUFJO1lBQ0YsMkVBQTJFO1lBQzNFLDJEQUEyRDtZQUMzRCxNQUFNLE9BQU8sR0FBRyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUUvRSxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixTQUFTLEVBQUUsQ0FBQztnQkFDWixPQUFPLEVBQUUsT0FBTzthQUNqQixDQUFDO1NBQ0g7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0MsTUFBTSxLQUFLLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBUztRQUN4QixJQUFJO1lBQ0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFaEQsbURBQW1EO1lBQ25ELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQzFDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDO1lBQzlFLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDO1lBRTNDLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztZQUM3QixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBa0MsQ0FBQztZQUMvRCxJQUFJLE9BQU8sRUFBRSxHQUFHO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0MsSUFBSSxPQUFPLEVBQUUsR0FBRztnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDdkQsSUFBSSxPQUFPLEVBQUUsS0FBSztnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkQsSUFBSSxXQUFXLENBQUMsU0FBUyxHQUFHLEdBQUc7Z0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBRWpFLE9BQU87Z0JBQ0wsS0FBSztnQkFDTCxTQUFTO2dCQUNULEtBQUs7Z0JBQ0wsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO2dCQUNoQyxPQUFPO2FBQ1IsQ0FBQztTQUNIO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNDLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO3dHQTlLVSxnQkFBZ0Isa0JBVVAsZ0JBQWdCOzRHQVZ6QixnQkFBZ0IsY0FGZixNQUFNOzs0RkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFXYyxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBmcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2hhcmVSZXBsYXksIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBUcmFjZVRhaWwgZnJvbSAnQHRyYWNldGFpbC9qcyc7XG5pbXBvcnQgeyBUUkFDRVRBSUxfQ09ORklHIH0gZnJvbSAnLi90cmFjZXRhaWwuY29uZmlnJztcbmltcG9ydCB7IFxuICBUcmFjZVRhaWxDb25maWcsIFxuICBGaW5nZXJwcmludCwgXG4gIFRyYWNraW5nUmVzdWx0LCBcbiAgRnJhdWRSZXN1bHQgXG59IGZyb20gJy4vdHJhY2V0YWlsLnR5cGVzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVHJhY2VUYWlsU2VydmljZSB7XG4gIHByaXZhdGUgY2xpZW50OiBUcmFjZVRhaWw7XG4gIHByaXZhdGUgZmluZ2VycHJpbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaW5nZXJwcmludCB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIGxvYWRpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHJpdmF0ZSBlcnJvclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVycm9yIHwgbnVsbD4obnVsbCk7XG5cbiAgZmluZ2VycHJpbnQkID0gdGhpcy5maW5nZXJwcmludFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGxvYWRpbmckID0gdGhpcy5sb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgZXJyb3IkID0gdGhpcy5lcnJvclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChUUkFDRVRBSUxfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVHJhY2VUYWlsQ29uZmlnKSB7XG4gICAgdGhpcy5pbml0aWFsaXplQ2xpZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDbGllbnQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEhhbmRsZSB0ZXN0IG1vZGVcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5jb25maWc/LnRlc3RNb2RlICYmIHRoaXMuY29uZmlnLmNvbmZpZy5tb2NrRGF0YSkge1xuICAgICAgICB0aGlzLmZpbmdlcnByaW50U3ViamVjdC5uZXh0KHtcbiAgICAgICAgICB2aXNpdG9ySWQ6ICdtb2NrLXZpc2l0b3ItMTIzJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAwLjk5LFxuICAgICAgICAgIHJpc2tTY29yZTogMC4xLFxuICAgICAgICAgIGZyYXVkdWxlbnQ6IGZhbHNlLFxuICAgICAgICAgIHNpZ25hbHM6IHt9LFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgICAuLi50aGlzLmNvbmZpZy5jb25maWcubW9ja0RhdGFcbiAgICAgICAgfSBhcyBGaW5nZXJwcmludCk7XG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSByZWFsIGNsaWVudFxuICAgICAgdGhpcy5jbGllbnQgPSBuZXcgVHJhY2VUYWlsKHtcbiAgICAgICAgYXBpS2V5OiB0aGlzLmNvbmZpZy5hcGlLZXksXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLmNvbmZpZz8udGltZW91dCxcbiAgICAgICAgZGVidWc6IHRoaXMuY29uZmlnLmNvbmZpZz8uZGVidWcgfHwgZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgaW5pdGlhbCBmaW5nZXJwcmludFxuICAgICAgdGhpcy5sb2FkRmluZ2VycHJpbnQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmluZ2VycHJpbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIHRoaXMuZXJyb3JTdWJqZWN0Lm5leHQobnVsbCk7XG5cbiAgICAgIC8vIFVzZSB2ZXJib3NlOiB0cnVlIHRvIGdldCBjb21wb25lbnRzIGluIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jbGllbnQuZ2VuZXJhdGVGaW5nZXJwcmludCh7IHZlcmJvc2U6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGZpbmdlcnByaW50OiBGaW5nZXJwcmludCA9IHtcbiAgICAgICAgdmlzaXRvcklkOiByZXN1bHQudmlzaXRvcklkLFxuICAgICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcbiAgICAgICAgcmlza1Njb3JlOiAwLCAgLy8gRGVmYXVsdCB2YWx1ZSAtIG5vdCBpbiBiYXNlIFNES1xuICAgICAgICBmcmF1ZHVsZW50OiBmYWxzZSwgIC8vIERlZmF1bHQgdmFsdWUgLSBub3QgaW4gYmFzZSBTREtcbiAgICAgICAgc2lnbmFsczogcmVzdWx0LmNvbXBvbmVudHMgfHwge30sXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgcHJvY2Vzc2luZ1RpbWU6IHJlc3VsdC5wcm9jZXNzaW5nVGltZVxuICAgICAgfTtcblxuICAgICAgdGhpcy5maW5nZXJwcmludFN1YmplY3QubmV4dChmaW5nZXJwcmludCk7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RyYWNlVGFpbCBlcnJvcjonLCBlcnJvcik7XG4gICAgdGhpcy5lcnJvclN1YmplY3QubmV4dChlcnJvcik7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBmaW5nZXJwcmludCBhcyBhIHByb21pc2VcbiAgICovXG4gIGFzeW5jIGdldEZpbmdlcnByaW50KCk6IFByb21pc2U8RmluZ2VycHJpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5maW5nZXJwcmludFN1YmplY3QudmFsdWU7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIGZpbmdlcnByaW50IHRvIGJlIGxvYWRlZFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmZpbmdlcnByaW50JC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZmluZ2VycHJpbnQpID0+IHtcbiAgICAgICAgICBpZiAoZmluZ2VycHJpbnQpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZShmaW5nZXJwcmludCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYW4gZXZlbnRcbiAgICovXG4gIGFzeW5jIHRyYWNrRXZlbnQoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8VHJhY2tpbmdSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJhY2VUYWlsIGRvZXNuJ3QgaGF2ZSBhIHRyYWNrIG1ldGhvZCAtIHRoaXMgaXMgY3VzdG9tIGFwcCBmdW5jdGlvbmFsaXR5XG4gICAgICAvLyBGb3Igbm93LCBqdXN0IHJldHVybiBtb2NrIGRhdGEgd2l0aCBhIGdlbmVyYXRlZCBldmVudCBJRFxuICAgICAgY29uc3QgZXZlbnRJZCA9IGBldnRfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBmcmF1ZHVsZW50OiBmYWxzZSxcbiAgICAgICAgcmlza1Njb3JlOiAwLFxuICAgICAgICBldmVudElkOiBldmVudElkXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdUcmFjayBldmVudCBlcnJvcjonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGZyYXVkXG4gICAqL1xuICBhc3luYyBjaGVja0ZyYXVkKGRhdGE6IGFueSk6IFByb21pc2U8RnJhdWRSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmluZ2VycHJpbnQgPSBhd2FpdCB0aGlzLmdldEZpbmdlcnByaW50KCk7XG4gICAgICBcbiAgICAgIC8vIFNpbXBsZSBmcmF1ZCBkZXRlY3Rpb24gbG9naWMgYmFzZWQgb24gcmlzayBzY29yZVxuICAgICAgY29uc3QgYmxvY2sgPSBmaW5nZXJwcmludC5yaXNrU2NvcmUgPiAwLjg7XG4gICAgICBjb25zdCBjaGFsbGVuZ2UgPSBmaW5nZXJwcmludC5yaXNrU2NvcmUgPiAwLjUgJiYgZmluZ2VycHJpbnQucmlza1Njb3JlIDw9IDAuODtcbiAgICAgIGNvbnN0IGFsbG93ID0gZmluZ2VycHJpbnQucmlza1Njb3JlIDw9IDAuNTtcbiAgICAgIFxuICAgICAgY29uc3QgcmVhc29uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBmaW5nZXJwcmludC5zaWduYWxzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgaWYgKHNpZ25hbHM/LnZwbikgcmVhc29ucy5wdXNoKCdWUE4gZGV0ZWN0ZWQnKTtcbiAgICAgIGlmIChzaWduYWxzPy50b3IpIHJlYXNvbnMucHVzaCgnVG9yIGJyb3dzZXIgZGV0ZWN0ZWQnKTtcbiAgICAgIGlmIChzaWduYWxzPy5wcm94eSkgcmVhc29ucy5wdXNoKCdQcm94eSBkZXRlY3RlZCcpO1xuICAgICAgaWYgKGZpbmdlcnByaW50LnJpc2tTY29yZSA+IDAuNykgcmVhc29ucy5wdXNoKCdIaWdoIHJpc2sgc2NvcmUnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmxvY2ssXG4gICAgICAgIGNoYWxsZW5nZSxcbiAgICAgICAgYWxsb3csXG4gICAgICAgIHJpc2tTY29yZTogZmluZ2VycHJpbnQucmlza1Njb3JlLFxuICAgICAgICByZWFzb25zXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGcmF1ZCBjaGVjayBlcnJvcjonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cnkgZmluZ2VycHJpbnRpbmdcbiAgICovXG4gIHJldHJ5KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEZpbmdlcnByaW50KCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgcmVmcmVzaCBmaW5nZXJwcmludFxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRGaW5nZXJwcmludCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByYXcgVHJhY2VUYWlsIGNsaWVudCBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IFRyYWNlVGFpbCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50O1xuICB9XG59Il19
@@ -2,4 +2,4 @@
2
2
  * TraceTail types for Angular
3
3
  */
4
4
  export {};
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2V0YWlsLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFjZXRhaWwudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYWNlVGFpbCB0eXBlcyBmb3IgQW5ndWxhclxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZ2VycHJpbnQge1xuICB2aXNpdG9ySWQ6IHN0cmluZztcbiAgY29uZmlkZW5jZTogbnVtYmVyO1xuICByaXNrU2NvcmU6IG51bWJlcjtcbiAgZnJhdWR1bGVudDogYm9vbGVhbjtcbiAgc2lnbmFsczogU2lnbmFsRGF0YTtcbiAgdGltZXN0YW1wOiBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERhdGEge1xuICBicm93c2VyOiBzdHJpbmc7XG4gIG9zOiBzdHJpbmc7XG4gIGRldmljZTogc3RyaW5nO1xuICBzY3JlZW46IHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIGNvbG9yRGVwdGg6IG51bWJlcjtcbiAgfTtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgcGx1Z2luczogc3RyaW5nW107XG4gIGZvbnRzOiBzdHJpbmdbXTtcbiAgY2FudmFzOiBzdHJpbmc7XG4gIHdlYmdsOiBzdHJpbmc7XG4gIGF1ZGlvOiBzdHJpbmc7XG4gIHZwbjogYm9vbGVhbjtcbiAgdG9yOiBib29sZWFuO1xuICBwcm94eTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja2luZ1Jlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGZyYXVkdWxlbnQ6IGJvb2xlYW47XG4gIHJpc2tTY29yZTogbnVtYmVyO1xuICBldmVudElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnJhdWRSZXN1bHQge1xuICBibG9jazogYm9vbGVhbjtcbiAgY2hhbGxlbmdlOiBib29sZWFuO1xuICBhbGxvdzogYm9vbGVhbjtcbiAgcmlza1Njb3JlOiBudW1iZXI7XG4gIHJlYXNvbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNlVGFpbENvbmZpZyB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBjb25maWc/OiB7XG4gICAgZW5oYW5jZWQ/OiBib29sZWFuO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIHRlc3RNb2RlPzogYm9vbGVhbjtcbiAgICBtb2NrRGF0YT86IFBhcnRpYWw8RmluZ2VycHJpbnQ+O1xuICB9O1xufSJdfQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2V0YWlsLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFjZXRhaWwudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYWNlVGFpbCB0eXBlcyBmb3IgQW5ndWxhclxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZ2VycHJpbnQge1xuICB2aXNpdG9ySWQ6IHN0cmluZztcbiAgY29uZmlkZW5jZTogbnVtYmVyO1xuICByaXNrU2NvcmU6IG51bWJlcjtcbiAgZnJhdWR1bGVudDogYm9vbGVhbjtcbiAgc2lnbmFsczogdW5rbm93bjtcbiAgdGltZXN0YW1wOiBEYXRlO1xuICBwcm9jZXNzaW5nVGltZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEYXRhIHtcbiAgYnJvd3Nlcjogc3RyaW5nO1xuICBvczogc3RyaW5nO1xuICBkZXZpY2U6IHN0cmluZztcbiAgc2NyZWVuOiB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBjb2xvckRlcHRoOiBudW1iZXI7XG4gIH07XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIHBsdWdpbnM6IHN0cmluZ1tdO1xuICBmb250czogc3RyaW5nW107XG4gIGNhbnZhczogc3RyaW5nO1xuICB3ZWJnbDogc3RyaW5nO1xuICBhdWRpbzogc3RyaW5nO1xuICB2cG46IGJvb2xlYW47XG4gIHRvcjogYm9vbGVhbjtcbiAgcHJveHk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2tpbmdSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBmcmF1ZHVsZW50OiBib29sZWFuO1xuICByaXNrU2NvcmU6IG51bWJlcjtcbiAgZXZlbnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZyYXVkUmVzdWx0IHtcbiAgYmxvY2s6IGJvb2xlYW47XG4gIGNoYWxsZW5nZTogYm9vbGVhbjtcbiAgYWxsb3c6IGJvb2xlYW47XG4gIHJpc2tTY29yZTogbnVtYmVyO1xuICByZWFzb25zOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFjZVRhaWxDb25maWcge1xuICBhcGlLZXk6IHN0cmluZztcbiAgY29uZmlnPzoge1xuICAgIGVuaGFuY2VkPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIGVuZHBvaW50Pzogc3RyaW5nO1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICB0ZXN0TW9kZT86IGJvb2xlYW47XG4gICAgbW9ja0RhdGE/OiBQYXJ0aWFsPEZpbmdlcnByaW50PjtcbiAgfTtcbn0iXX0=
@@ -63,14 +63,16 @@ class TraceTailService {
63
63
  try {
64
64
  this.loadingSubject.next(true);
65
65
  this.errorSubject.next(null);
66
- const result = await this.client.generateFingerprint();
66
+ // Use verbose: true to get components in the response
67
+ const result = await this.client.generateFingerprint({ verbose: true });
67
68
  const fingerprint = {
68
69
  visitorId: result.visitorId,
69
70
  confidence: result.confidence,
70
71
  riskScore: 0,
71
72
  fraudulent: false,
72
73
  signals: result.components || {},
73
- timestamp: new Date()
74
+ timestamp: new Date(),
75
+ processingTime: result.processingTime
74
76
  };
75
77
  this.fingerprintSubject.next(fingerprint);
76
78
  this.loadingSubject.next(false);
@@ -139,11 +141,12 @@ class TraceTailService {
139
141
  const challenge = fingerprint.riskScore > 0.5 && fingerprint.riskScore <= 0.8;
140
142
  const allow = fingerprint.riskScore <= 0.5;
141
143
  const reasons = [];
142
- if (fingerprint.signals.vpn)
144
+ const signals = fingerprint.signals;
145
+ if (signals?.vpn)
143
146
  reasons.push('VPN detected');
144
- if (fingerprint.signals.tor)
147
+ if (signals?.tor)
145
148
  reasons.push('Tor browser detected');
146
- if (fingerprint.signals.proxy)
149
+ if (signals?.proxy)
147
150
  reasons.push('Proxy detected');
148
151
  if (fingerprint.riskScore > 0.7)
149
152
  reasons.push('High risk score');
@@ -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: {} as any,\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 const result = await this.client.generateFingerprint();\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 || {} as any,\n timestamp: new Date()\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 if (fingerprint.signals.vpn) reasons.push('VPN detected');\n if (fingerprint.signals.tor) reasons.push('Tor browser detected');\n if (fingerprint.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: SignalData;\n timestamp: Date;\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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"}
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":"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"}
@@ -6,8 +6,9 @@ export interface Fingerprint {
6
6
  confidence: number;
7
7
  riskScore: number;
8
8
  fraudulent: boolean;
9
- signals: SignalData;
9
+ signals: unknown;
10
10
  timestamp: Date;
11
+ processingTime?: number;
11
12
  }
12
13
  export interface SignalData {
13
14
  browser: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracetail/angular",
3
- "version": "2.3.6",
3
+ "version": "2.3.8",
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",
@@ -25,7 +25,7 @@
25
25
  "lint": "ng lint",
26
26
  "prepublishOnly": "npm run build"
27
27
  },
28
- "homepage": "https://demo-angular.tracetail.io",
28
+ "homepage": "https://demo.tracetail.io/angular",
29
29
  "repository": {
30
30
  "type": "git",
31
31
  "url": "https://github.com/tracetail/tracetail-js.git",
@@ -54,7 +54,7 @@
54
54
  "rxjs": "^7.0.0"
55
55
  },
56
56
  "dependencies": {
57
- "@tracetail/js": "^2.3.3"
57
+ "@tracetail/js": "^2.3.8"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@angular/common": "^17.0.0",