vesant-sdk 1.7.0-dev.b2c9ecf → 1.7.0-dev.b4284ca

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.
Files changed (75) hide show
  1. package/dist/{client-B32yBt1b.d.ts → client-0NOPDnT0.d.ts} +16 -26
  2. package/dist/{client-BqPVh5jH.d.mts → client-CvWNRwwg.d.mts} +16 -26
  3. package/dist/{client-CHPEgasE.d.mts → client-Dps40EtF.d.mts} +2 -2
  4. package/dist/{client-pKE_gii_.d.ts → client-SMxqod4j.d.ts} +2 -2
  5. package/dist/{client-6sSaxufk.d.mts → client-q9fN8Hhf.d.mts} +96 -1
  6. package/dist/{client-6sSaxufk.d.ts → client-q9fN8Hhf.d.ts} +96 -1
  7. package/dist/compliance/index.d.mts +3 -3
  8. package/dist/compliance/index.d.ts +3 -3
  9. package/dist/compliance/index.js +114 -16
  10. package/dist/compliance/index.js.map +1 -1
  11. package/dist/compliance/index.mjs +114 -16
  12. package/dist/compliance/index.mjs.map +1 -1
  13. package/dist/decisions/index.d.mts +1 -1
  14. package/dist/decisions/index.d.ts +1 -1
  15. package/dist/decisions/index.js +49 -4
  16. package/dist/decisions/index.js.map +1 -1
  17. package/dist/decisions/index.mjs +49 -4
  18. package/dist/decisions/index.mjs.map +1 -1
  19. package/dist/geolocation/index.d.mts +59 -4
  20. package/dist/geolocation/index.d.ts +59 -4
  21. package/dist/geolocation/index.js +117 -16
  22. package/dist/geolocation/index.js.map +1 -1
  23. package/dist/geolocation/index.mjs +115 -17
  24. package/dist/geolocation/index.mjs.map +1 -1
  25. package/dist/index-CPOrMRaH.d.ts +264 -0
  26. package/dist/index-CimDmgZb.d.mts +264 -0
  27. package/dist/index.d.mts +25 -8
  28. package/dist/index.d.ts +25 -8
  29. package/dist/index.js +274 -37
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +267 -38
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/kyc/core.d.mts +1 -1
  34. package/dist/kyc/core.d.ts +1 -1
  35. package/dist/kyc/core.js +49 -4
  36. package/dist/kyc/core.js.map +1 -1
  37. package/dist/kyc/core.mjs +49 -4
  38. package/dist/kyc/core.mjs.map +1 -1
  39. package/dist/kyc/index.d.mts +1 -1
  40. package/dist/kyc/index.d.ts +1 -1
  41. package/dist/kyc/index.js +49 -4
  42. package/dist/kyc/index.js.map +1 -1
  43. package/dist/kyc/index.mjs +49 -4
  44. package/dist/kyc/index.mjs.map +1 -1
  45. package/dist/react.d.mts +7 -3
  46. package/dist/react.d.ts +7 -3
  47. package/dist/react.js +68 -4
  48. package/dist/react.js.map +1 -1
  49. package/dist/react.mjs +68 -4
  50. package/dist/react.mjs.map +1 -1
  51. package/dist/risk-profile/index.d.mts +1 -1
  52. package/dist/risk-profile/index.d.ts +1 -1
  53. package/dist/risk-profile/index.js +49 -4
  54. package/dist/risk-profile/index.js.map +1 -1
  55. package/dist/risk-profile/index.mjs +49 -4
  56. package/dist/risk-profile/index.mjs.map +1 -1
  57. package/dist/scores/index.d.mts +1 -1
  58. package/dist/scores/index.d.ts +1 -1
  59. package/dist/scores/index.js +49 -4
  60. package/dist/scores/index.js.map +1 -1
  61. package/dist/scores/index.mjs +49 -4
  62. package/dist/scores/index.mjs.map +1 -1
  63. package/dist/tax/index.d.mts +1 -1
  64. package/dist/tax/index.d.ts +1 -1
  65. package/dist/tax/index.js +49 -4
  66. package/dist/tax/index.js.map +1 -1
  67. package/dist/tax/index.mjs +49 -4
  68. package/dist/tax/index.mjs.map +1 -1
  69. package/dist/webhooks/index.d.mts +2 -189
  70. package/dist/webhooks/index.d.ts +2 -189
  71. package/dist/webhooks/index.js +85 -21
  72. package/dist/webhooks/index.js.map +1 -1
  73. package/dist/webhooks/index.mjs +85 -22
  74. package/dist/webhooks/index.mjs.map +1 -1
  75. package/package.json +4 -1
package/dist/react.mjs CHANGED
@@ -87,6 +87,61 @@ function getBrowserInfo() {
87
87
  return { browser, browser_version: browserVersion, os, os_version: osVersion };
88
88
  }
89
89
 
90
+ // src/geolocation/integrity.ts
91
+ var isNil = (v) => v === null || v === void 0;
92
+ function assessGpsIntegrity(input, opts = {}) {
93
+ const flags = [];
94
+ const now = opts.now ?? (() => Date.now());
95
+ const maxAgeMs = opts.maxAgeMs ?? 6e4;
96
+ const minAccuracy = opts.minAccuracyMeters ?? 1;
97
+ const { accuracy, altitude, altitudeAccuracy, heading, speed, timestamp } = input;
98
+ if (isNil(accuracy)) {
99
+ flags.push("accuracy_missing");
100
+ } else if (accuracy === 0) {
101
+ flags.push("accuracy_zero");
102
+ } else if (accuracy < minAccuracy) {
103
+ flags.push("accuracy_implausibly_small");
104
+ }
105
+ const hasMotion = !isNil(heading) || !isNil(speed);
106
+ if (hasMotion && (isNil(accuracy) || accuracy === 0)) {
107
+ flags.push("motion_without_accuracy");
108
+ }
109
+ if (!isNil(altitude) && isNil(altitudeAccuracy)) {
110
+ flags.push("altitude_without_accuracy");
111
+ }
112
+ if (timestamp !== void 0 && now() - timestamp > maxAgeMs) {
113
+ flags.push("stale_timestamp");
114
+ }
115
+ if (opts.permissionState === "denied" || opts.permissionState === "prompt") {
116
+ flags.push(`permission_${opts.permissionState}`);
117
+ }
118
+ return { suspicious: flags.length > 0, flags };
119
+ }
120
+ function gpsIntegrityInputFromPosition(position) {
121
+ const c = position.coords;
122
+ return {
123
+ latitude: c.latitude,
124
+ longitude: c.longitude,
125
+ accuracy: c.accuracy,
126
+ altitude: c.altitude,
127
+ altitudeAccuracy: c.altitudeAccuracy,
128
+ heading: c.heading,
129
+ speed: c.speed,
130
+ timestamp: position.timestamp
131
+ };
132
+ }
133
+ async function probeGeolocationPermission() {
134
+ try {
135
+ if (typeof navigator === "undefined" || !navigator.permissions?.query) {
136
+ return "unavailable";
137
+ }
138
+ const status = await navigator.permissions.query({ name: "geolocation" });
139
+ return status.state;
140
+ } catch {
141
+ return "unavailable";
142
+ }
143
+ }
144
+
90
145
  // src/geolocation/ciphertext.ts
91
146
  var CIPHER_TEXT_EXPIRY_MINUTES = 5;
92
147
  async function computeHMAC(key, message) {
@@ -139,6 +194,7 @@ async function requestGPSLocation(timeout = 1e4, highAccuracy = true) {
139
194
  if (typeof navigator === "undefined" || !navigator.geolocation) {
140
195
  return null;
141
196
  }
197
+ const permissionState = await probeGeolocationPermission();
142
198
  return new Promise((resolve) => {
143
199
  navigator.geolocation.getCurrentPosition(
144
200
  (position) => {
@@ -155,6 +211,7 @@ async function requestGPSLocation(timeout = 1e4, highAccuracy = true) {
155
211
  resolve(null);
156
212
  return;
157
213
  }
214
+ const { flags } = assessGpsIntegrity(gpsIntegrityInputFromPosition(position), { permissionState });
158
215
  resolve({
159
216
  latitude,
160
217
  longitude,
@@ -163,7 +220,8 @@ async function requestGPSLocation(timeout = 1e4, highAccuracy = true) {
163
220
  altitude_accuracy: position.coords.altitudeAccuracy ?? void 0,
164
221
  heading: position.coords.heading ?? void 0,
165
222
  speed: position.coords.speed ?? void 0,
166
- timestamp: position.timestamp
223
+ timestamp: position.timestamp,
224
+ integrity_flags: flags.length ? flags : void 0
167
225
  });
168
226
  },
169
227
  () => {
@@ -230,6 +288,9 @@ async function generateCipherText(options, config) {
230
288
  );
231
289
  if (location) {
232
290
  locationData = location;
291
+ if (location.integrity_flags?.length) {
292
+ warnings.push(`GPS integrity flags (advisory): ${location.integrity_flags.join(", ")}`);
293
+ }
233
294
  } else if (gpsRequiredByConfig) {
234
295
  throw new VesantError(
235
296
  `GPS location is required for ${options.reason} by tenant configuration, but GPS was not available or permission was denied`,
@@ -332,8 +393,6 @@ function useGeolocation(client, options = {}) {
332
393
  if (optionsRef.current.autoVerify) {
333
394
  const detectAndVerify = async () => {
334
395
  try {
335
- const ipResponse = await fetch("https://api.ipify.org?format=json");
336
- const { ip } = await ipResponse.json();
337
396
  let deviceFingerprint;
338
397
  if (optionsRef.current.includeDeviceFingerprint && typeof window !== "undefined") {
339
398
  const deviceId = generateDeviceId();
@@ -347,7 +406,6 @@ function useGeolocation(client, options = {}) {
347
406
  };
348
407
  }
349
408
  await verifyIP({
350
- ip_address: ip,
351
409
  user_id: optionsRef.current.userId || "",
352
410
  event_type: optionsRef.current.eventType || "page_view",
353
411
  device_fingerprint: deviceFingerprint
@@ -661,6 +719,12 @@ function useLocationCapture(client, options) {
661
719
  if (accuracy !== null && accuracy !== void 0 && accuracy > 0) {
662
720
  capture.accuracy = accuracy;
663
721
  }
722
+ const { flags } = assessGpsIntegrity(gpsIntegrityInputFromPosition(position), {
723
+ permissionState: await probeGeolocationPermission()
724
+ });
725
+ if (flags.length) {
726
+ capture.integrity_flags = flags;
727
+ }
664
728
  }
665
729
  }
666
730
  if (gpsError) {