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.
- package/dist/{client-B32yBt1b.d.ts → client-0NOPDnT0.d.ts} +16 -26
- package/dist/{client-BqPVh5jH.d.mts → client-CvWNRwwg.d.mts} +16 -26
- package/dist/{client-CHPEgasE.d.mts → client-Dps40EtF.d.mts} +2 -2
- package/dist/{client-pKE_gii_.d.ts → client-SMxqod4j.d.ts} +2 -2
- package/dist/{client-6sSaxufk.d.mts → client-q9fN8Hhf.d.mts} +96 -1
- package/dist/{client-6sSaxufk.d.ts → client-q9fN8Hhf.d.ts} +96 -1
- package/dist/compliance/index.d.mts +3 -3
- package/dist/compliance/index.d.ts +3 -3
- package/dist/compliance/index.js +114 -16
- package/dist/compliance/index.js.map +1 -1
- package/dist/compliance/index.mjs +114 -16
- package/dist/compliance/index.mjs.map +1 -1
- package/dist/decisions/index.d.mts +1 -1
- package/dist/decisions/index.d.ts +1 -1
- package/dist/decisions/index.js +49 -4
- package/dist/decisions/index.js.map +1 -1
- package/dist/decisions/index.mjs +49 -4
- package/dist/decisions/index.mjs.map +1 -1
- package/dist/geolocation/index.d.mts +59 -4
- package/dist/geolocation/index.d.ts +59 -4
- package/dist/geolocation/index.js +117 -16
- package/dist/geolocation/index.js.map +1 -1
- package/dist/geolocation/index.mjs +115 -17
- package/dist/geolocation/index.mjs.map +1 -1
- package/dist/index-CPOrMRaH.d.ts +264 -0
- package/dist/index-CimDmgZb.d.mts +264 -0
- package/dist/index.d.mts +25 -8
- package/dist/index.d.ts +25 -8
- package/dist/index.js +274 -37
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +267 -38
- package/dist/index.mjs.map +1 -1
- package/dist/kyc/core.d.mts +1 -1
- package/dist/kyc/core.d.ts +1 -1
- package/dist/kyc/core.js +49 -4
- package/dist/kyc/core.js.map +1 -1
- package/dist/kyc/core.mjs +49 -4
- package/dist/kyc/core.mjs.map +1 -1
- package/dist/kyc/index.d.mts +1 -1
- package/dist/kyc/index.d.ts +1 -1
- package/dist/kyc/index.js +49 -4
- package/dist/kyc/index.js.map +1 -1
- package/dist/kyc/index.mjs +49 -4
- package/dist/kyc/index.mjs.map +1 -1
- package/dist/react.d.mts +7 -3
- package/dist/react.d.ts +7 -3
- package/dist/react.js +68 -4
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +68 -4
- package/dist/react.mjs.map +1 -1
- package/dist/risk-profile/index.d.mts +1 -1
- package/dist/risk-profile/index.d.ts +1 -1
- package/dist/risk-profile/index.js +49 -4
- package/dist/risk-profile/index.js.map +1 -1
- package/dist/risk-profile/index.mjs +49 -4
- package/dist/risk-profile/index.mjs.map +1 -1
- package/dist/scores/index.d.mts +1 -1
- package/dist/scores/index.d.ts +1 -1
- package/dist/scores/index.js +49 -4
- package/dist/scores/index.js.map +1 -1
- package/dist/scores/index.mjs +49 -4
- package/dist/scores/index.mjs.map +1 -1
- package/dist/tax/index.d.mts +1 -1
- package/dist/tax/index.d.ts +1 -1
- package/dist/tax/index.js +49 -4
- package/dist/tax/index.js.map +1 -1
- package/dist/tax/index.mjs +49 -4
- package/dist/tax/index.mjs.map +1 -1
- package/dist/webhooks/index.d.mts +2 -189
- package/dist/webhooks/index.d.ts +2 -189
- package/dist/webhooks/index.js +85 -21
- package/dist/webhooks/index.js.map +1 -1
- package/dist/webhooks/index.mjs +85 -22
- package/dist/webhooks/index.mjs.map +1 -1
- 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) {
|