@prosopo/provider 5.19.2 → 5.19.4

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 (59) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +10 -9
  2. package/.turbo/turbo-build$colon$tsc.log +28 -28
  3. package/.turbo/turbo-build.log +10 -9
  4. package/CHANGELOG.md +75 -0
  5. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  6. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +79 -23
  7. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  8. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts +3 -0
  9. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  10. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +23 -5
  11. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  12. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  13. package/dist/api/captcha/submitPoWCaptchaSolution.js +12 -2
  14. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  15. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +79 -23
  16. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +22 -3
  17. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +12 -2
  18. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +8 -5
  19. package/dist/cjs/tasks/frictionless/ipMatch.cjs +25 -4
  20. package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +17 -8
  21. package/dist/cjs/utils/devicePlatform.cjs +9 -5
  22. package/dist/cjs/utils/mobileSignals.cjs +69 -0
  23. package/dist/tasks/frictionless/frictionlessTasks.d.ts +1 -1
  24. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  25. package/dist/tasks/frictionless/frictionlessTasks.js +9 -6
  26. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  27. package/dist/tasks/frictionless/ipMatch.d.ts +1 -1
  28. package/dist/tasks/frictionless/ipMatch.d.ts.map +1 -1
  29. package/dist/tasks/frictionless/ipMatch.js +25 -4
  30. package/dist/tasks/frictionless/ipMatch.js.map +1 -1
  31. package/dist/tasks/puzzle/puzzleRenderer.d.ts +8 -1
  32. package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
  33. package/dist/tasks/puzzle/puzzleRenderer.js +16 -8
  34. package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
  35. package/dist/tests/integration/webBotAuthAuthenticated.integration.test.js +103 -5
  36. package/dist/tests/integration/webBotAuthAuthenticated.integration.test.js.map +1 -1
  37. package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.d.ts +2 -0
  38. package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.d.ts.map +1 -0
  39. package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.js +210 -0
  40. package/dist/tests/unit/api/captcha/puzzleTouchFloors.unit.test.js.map +1 -0
  41. package/dist/tests/unit/tasks/frictionless/ipMatch.unit.test.js +18 -0
  42. package/dist/tests/unit/tasks/frictionless/ipMatch.unit.test.js.map +1 -1
  43. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js +18 -0
  44. package/dist/tests/unit/tasks/frictionless/routerPuzzleOverrides.unit.test.js.map +1 -1
  45. package/dist/tests/unit/utils/devicePlatform.unit.test.js +9 -8
  46. package/dist/tests/unit/utils/devicePlatform.unit.test.js.map +1 -1
  47. package/dist/tests/unit/utils/mobileSignals.unit.test.d.ts +2 -0
  48. package/dist/tests/unit/utils/mobileSignals.unit.test.d.ts.map +1 -0
  49. package/dist/tests/unit/utils/mobileSignals.unit.test.js +161 -0
  50. package/dist/tests/unit/utils/mobileSignals.unit.test.js.map +1 -0
  51. package/dist/utils/devicePlatform.d.ts +3 -3
  52. package/dist/utils/devicePlatform.d.ts.map +1 -1
  53. package/dist/utils/devicePlatform.js +9 -5
  54. package/dist/utils/devicePlatform.js.map +1 -1
  55. package/dist/utils/mobileSignals.d.ts +32 -0
  56. package/dist/utils/mobileSignals.d.ts.map +1 -0
  57. package/dist/utils/mobileSignals.js +68 -0
  58. package/dist/utils/mobileSignals.js.map +1 -0
  59. package/package.json +17 -17
@@ -0,0 +1,161 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { deriveMobileVerdict, } from "../../../utils/mobileSignals.js";
3
+ const IPHONE_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
4
+ const PIXEL_UA = "Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36";
5
+ const WINDOWS_CHROME_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36";
6
+ const MAC_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15";
7
+ const LINUX_FIREFOX_UA = "Mozilla/5.0 (X11; Linux x86_64; rv:135.0) Gecko/20100101 Firefox/135.0";
8
+ const androidChromeHints = {
9
+ "sec-ch-ua-mobile": "?1",
10
+ "sec-ch-ua-platform": '"Android"',
11
+ };
12
+ const windowsChromeHints = {
13
+ "sec-ch-ua-mobile": "?0",
14
+ "sec-ch-ua-platform": '"Windows"',
15
+ };
16
+ describe("deriveMobileVerdict", () => {
17
+ describe("device, not network", () => {
18
+ it("reads a phone on home Wi-Fi as mobile", () => {
19
+ expect(deriveMobileVerdict({
20
+ userAgent: IPHONE_UA,
21
+ carrierNetwork: false,
22
+ tcpMss: 1460,
23
+ }).isMobile).toBe(true);
24
+ });
25
+ it("does not read a tethered laptop as mobile", () => {
26
+ expect(deriveMobileVerdict({
27
+ userAgent: WINDOWS_CHROME_UA,
28
+ headers: windowsChromeHints,
29
+ carrierNetwork: true,
30
+ tcpMss: 1400,
31
+ }).isMobile).toBe(false);
32
+ });
33
+ it("does not read a touchscreen laptop as mobile", () => {
34
+ expect(deriveMobileVerdict({
35
+ userAgent: WINDOWS_CHROME_UA,
36
+ headers: windowsChromeHints,
37
+ deviceCapability: "mobile",
38
+ touchEventCount: 40,
39
+ }).isMobile).toBe(false);
40
+ });
41
+ });
42
+ describe("platform declarations", () => {
43
+ it("accepts a mobile UA alone, since WebKit sends no client hints", () => {
44
+ expect(deriveMobileVerdict({ userAgent: IPHONE_UA }).isMobile).toBe(true);
45
+ });
46
+ it("accepts the client hints alone, with no UA at all", () => {
47
+ expect(deriveMobileVerdict({ headers: androidChromeHints }).isMobile).toBe(true);
48
+ });
49
+ it("reads the platform hint case- and quote-insensitively", () => {
50
+ expect(deriveMobileVerdict({
51
+ headers: { "sec-ch-ua-platform": "iOS" },
52
+ }).evidence).toContain("clientHintPlatformMobile");
53
+ });
54
+ it("rejects a mobile UA the client hints contradict", () => {
55
+ expect(deriveMobileVerdict({
56
+ userAgent: PIXEL_UA,
57
+ headers: windowsChromeHints,
58
+ }).isMobile).toBe(false);
59
+ });
60
+ it("accepts a desktop UA the client hints contradict", () => {
61
+ expect(deriveMobileVerdict({
62
+ userAgent: WINDOWS_CHROME_UA,
63
+ headers: androidChromeHints,
64
+ }).isMobile).toBe(true);
65
+ });
66
+ it.each([
67
+ ["Windows Chrome", WINDOWS_CHROME_UA],
68
+ ["Mac Safari", MAC_UA],
69
+ ["Linux Firefox", LINUX_FIREFOX_UA],
70
+ ])("does not read %s as mobile", (_name, userAgent) => {
71
+ expect(deriveMobileVerdict({ userAgent }).isMobile).toBe(false);
72
+ });
73
+ });
74
+ describe("corroborating signals", () => {
75
+ it("does not let the carrier bit alone decide", () => {
76
+ expect(deriveMobileVerdict({ carrierNetwork: true }).isMobile).toBe(false);
77
+ });
78
+ it("does not let a tunnelled MSS alone decide", () => {
79
+ expect(deriveMobileVerdict({ tcpMss: 1348 }).isMobile).toBe(false);
80
+ });
81
+ it.each([1300, 1348, 1400, 1430])("counts MSS %i as tunnelled", (tcpMss) => {
82
+ expect(deriveMobileVerdict({ tcpMss }).evidence).toContain("tunnelledMss");
83
+ });
84
+ it("scores the carrier bit and a tunnelled MSS once between them", () => {
85
+ const both = deriveMobileVerdict({ carrierNetwork: true, tcpMss: 1400 });
86
+ const one = deriveMobileVerdict({ carrierNetwork: true });
87
+ expect(both.score).toBe(one.score);
88
+ expect(both.evidence).toEqual(["carrierNetwork+tunnelledMss"]);
89
+ });
90
+ it("does not let the two network signals plus a webView decide", () => {
91
+ expect(deriveMobileVerdict({
92
+ carrierNetwork: true,
93
+ tcpMss: 1400,
94
+ webView: true,
95
+ }).isMobile).toBe(false);
96
+ });
97
+ it.each([1452, 1460, 0])("does not count MSS %i as tunnelled", (tcpMss) => {
98
+ expect(deriveMobileVerdict({ tcpMss }).evidence).not.toContain("tunnelledMss");
99
+ });
100
+ it("lets touch evidence carry a UA-less client", () => {
101
+ expect(deriveMobileVerdict({
102
+ deviceCapability: "mobile",
103
+ touchEventCount: 12,
104
+ }).isMobile).toBe(true);
105
+ });
106
+ it("rejects a mobile UA that reports no touch support", () => {
107
+ expect(deriveMobileVerdict({
108
+ userAgent: PIXEL_UA,
109
+ deviceCapability: "desktop",
110
+ }).isMobile).toBe(false);
111
+ });
112
+ it("ignores a zero touch-event count", () => {
113
+ expect(deriveMobileVerdict({ touchEventCount: 0 }).evidence).not.toContain("touchEvents");
114
+ });
115
+ });
116
+ it("reads nothing as not mobile", () => {
117
+ const verdict = deriveMobileVerdict({});
118
+ expect(verdict.isMobile).toBe(false);
119
+ expect(verdict.score).toBe(0);
120
+ expect(verdict.evidence).toEqual([]);
121
+ });
122
+ describe("corroboration", () => {
123
+ it("is not corroborated by a User-Agent alone", () => {
124
+ const verdict = deriveMobileVerdict({ userAgent: IPHONE_UA });
125
+ expect(verdict.isMobile).toBe(true);
126
+ expect(verdict.corroborated).toBe(false);
127
+ });
128
+ it("is not corroborated by the client hints alone", () => {
129
+ const verdict = deriveMobileVerdict({ headers: androidChromeHints });
130
+ expect(verdict.isMobile).toBe(true);
131
+ expect(verdict.corroborated).toBe(false);
132
+ });
133
+ it.each([
134
+ ["a carrier network", { carrierNetwork: true }],
135
+ ["a tunnelled MSS", { tcpMss: 1400 }],
136
+ ["an in-app browser", { webView: true }],
137
+ ["touch support", { deviceCapability: "mobile" }],
138
+ ["touch events", { touchEventCount: 9 }],
139
+ ])("is corroborated by %s", (_name, extra) => {
140
+ const verdict = deriveMobileVerdict({
141
+ userAgent: IPHONE_UA,
142
+ ...extra,
143
+ });
144
+ expect(verdict.isMobile).toBe(true);
145
+ expect(verdict.corroborated).toBe(true);
146
+ });
147
+ it("is not corroborated by a signal that says desktop", () => {
148
+ expect(deriveMobileVerdict({
149
+ userAgent: IPHONE_UA,
150
+ deviceCapability: "desktop",
151
+ }).corroborated).toBe(false);
152
+ });
153
+ });
154
+ it("ignores empty header values", () => {
155
+ expect(deriveMobileVerdict({
156
+ userAgent: IPHONE_UA,
157
+ headers: { "sec-ch-ua-mobile": "", "sec-ch-ua-platform": "" },
158
+ }).evidence).toEqual(["userAgentMobile"]);
159
+ });
160
+ });
161
+ //# sourceMappingURL=mobileSignals.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobileSignals.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/utils/mobileSignals.unit.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { ITrafficFilter, RoutingMachinePlatform, TrafficCategoryPolicies } from "@prosopo/types";
2
- export declare const derivePlatform: (userAgent: string, webView: boolean, ipInfo?: {
3
- isMobile?: boolean;
4
- }) => RoutingMachinePlatform;
2
+ import { type MobileSignals } from "./mobileSignals.js";
3
+ export type PlatformSignals = Omit<MobileSignals, "userAgent" | "webView">;
4
+ export declare const derivePlatform: (userAgent: string, webView: boolean, signals?: PlatformSignals) => RoutingMachinePlatform;
5
5
  export declare const deriveTrafficPolicies: (trafficFilter: Partial<ITrafficFilter> | undefined) => TrafficCategoryPolicies | undefined;
6
6
  //# sourceMappingURL=devicePlatform.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devicePlatform.d.ts","sourceRoot":"","sources":["../../src/utils/devicePlatform.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACX,cAAc,EACd,sBAAsB,EACtB,uBAAuB,EACvB,MAAM,gBAAgB,CAAC;AAcxB,eAAO,MAAM,cAAc,cACf,MAAM,WACR,OAAO,WACP;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,KAC7B,sBAOD,CAAC;AA0BH,eAAO,MAAM,qBAAqB,kBAClB,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,KAChD,uBAAuB,GAAG,SAY5B,CAAC"}
1
+ {"version":3,"file":"devicePlatform.d.ts","sourceRoot":"","sources":["../../src/utils/devicePlatform.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACX,cAAc,EACd,sBAAsB,EACtB,uBAAuB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,oBAAoB,CAAC;AAQ7E,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;AAQ3E,eAAO,MAAM,cAAc,cACf,MAAM,WACR,OAAO,YACP,eAAe,KACtB,sBAID,CAAC;AA0BH,eAAO,MAAM,qBAAqB,kBAClB,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,KAChD,uBAAuB,GAAG,SAY5B,CAAC"}
@@ -1,16 +1,20 @@
1
+ import { deriveMobileVerdict } from "./mobileSignals.js";
1
2
  //#region src/utils/devicePlatform.ts
2
3
  var APPLE_UA_REGEX = /iPhone|iPad|iPod|Macintosh|Mac OS X/i;
3
- var MOBILE_UA_REGEX = /Mobile|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/i;
4
4
  /**
5
5
  * Derive platform flags from server-visible signals. `isWebView` is supplied
6
6
  * by the caller because that bit only comes from the encrypted bot-detection
7
- * payload, not request headers. `isMobile` prefers IPInfo's network-classified
8
- * mobile bit when present and falls back to UA parsing otherwise.
7
+ * payload, not request headers. `isMobile` is a weighed verdict over whatever
8
+ * signals the caller can supply — see `deriveMobileVerdict`.
9
9
  */
10
- var derivePlatform = (userAgent, webView, ipInfo) => ({
10
+ var derivePlatform = (userAgent, webView, signals = {}) => ({
11
11
  isApple: APPLE_UA_REGEX.test(userAgent),
12
12
  isWebView: webView,
13
- isMobile: typeof ipInfo?.isMobile === "boolean" ? ipInfo.isMobile : MOBILE_UA_REGEX.test(userAgent)
13
+ isMobile: deriveMobileVerdict({
14
+ ...signals,
15
+ userAgent,
16
+ webView
17
+ }).isMobile
14
18
  });
15
19
  var TRAFFIC_FILTER_CATEGORIES = [
16
20
  "vpn",
@@ -1 +1 @@
1
- {"version":3,"file":"devicePlatform.js","sourceRoot":"","sources":["../../src/utils/devicePlatform.ts"],"names":[],"mappings":"AAuBA,MAAM,cAAc,GAAG,sCAAsC,CAAC;AAC9D,MAAM,eAAe,GAAG,sDAAsD,CAAC;AAQ/E,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,SAAiB,EACjB,OAAgB,EAChB,MAA+B,EACN,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;IACvC,SAAS,EAAE,OAAO;IAClB,QAAQ,EACP,OAAO,MAAM,EAAE,QAAQ,KAAK,SAAS;QACpC,CAAC,CAAC,MAAM,CAAC,QAAQ;QACjB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;CACnC,CAAC,CAAC;AAKH,MAAM,yBAAyB,GAAG;IACjC,KAAK;IACL,OAAO;IACP,KAAK;IACL,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,SAAS;CACqD,CAAC;AAYhE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACpC,aAAkD,EACZ,EAAE;IACxC,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,MAAM,QAAQ,IAAI,yBAAyB,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YAC5B,GAAG,GAAG,IAAI,CAAC;QACZ,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC,CAAC"}
1
+ {"version":3,"file":"devicePlatform.js","sourceRoot":"","sources":["../../src/utils/devicePlatform.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAsB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK7E,MAAM,cAAc,GAAG,sCAAsC,CAAC;AAW9D,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,SAAiB,EACjB,OAAgB,EAChB,UAA2B,EAAE,EACJ,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;IACvC,SAAS,EAAE,OAAO;IAClB,QAAQ,EAAE,mBAAmB,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ;CAC1E,CAAC,CAAC;AAKH,MAAM,yBAAyB,GAAG;IACjC,KAAK;IACL,OAAO;IACP,KAAK;IACL,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,SAAS;CACqD,CAAC;AAYhE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACpC,aAAkD,EACZ,EAAE;IACxC,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,MAAM,QAAQ,IAAI,yBAAyB,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YAC5B,GAAG,GAAG,IAAI,CAAC;QACZ,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { RequestHeaders } from "@prosopo/types";
2
+ export interface MobileSignals {
3
+ userAgent?: string;
4
+ headers?: RequestHeaders;
5
+ carrierNetwork?: boolean;
6
+ tcpMss?: number;
7
+ webView?: boolean;
8
+ deviceCapability?: string;
9
+ touchEventCount?: number;
10
+ }
11
+ export interface MobileVerdict {
12
+ isMobile: boolean;
13
+ corroborated: boolean;
14
+ score: number;
15
+ evidence: string[];
16
+ }
17
+ export declare const MOBILE_SIGNAL_WEIGHTS: {
18
+ readonly userAgentMobile: 3;
19
+ readonly userAgentDesktop: -3;
20
+ readonly clientHintMobile: 3;
21
+ readonly clientHintNotMobile: -3;
22
+ readonly clientHintPlatformMobile: 3;
23
+ readonly clientHintPlatformDesktop: -3;
24
+ readonly touchCapability: 2;
25
+ readonly pointerCapability: -3;
26
+ readonly touchEvents: 2;
27
+ readonly webView: 1;
28
+ readonly network: 1;
29
+ };
30
+ export declare const MOBILE_SCORE_THRESHOLD = 3;
31
+ export declare const deriveMobileVerdict: (signals: MobileSignals) => MobileVerdict;
32
+ //# sourceMappingURL=mobileSignals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobileSignals.d.ts","sourceRoot":"","sources":["../../src/utils/mobileSignals.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAElB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IAEd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAeD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;CAexB,CAAC;AAEX,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAUxC,eAAO,MAAM,mBAAmB,YAAa,aAAa,KAAG,aAiF5D,CAAC"}
@@ -0,0 +1,68 @@
1
+ //#region src/utils/mobileSignals.ts
2
+ var MOBILE_UA_REGEX = /Mobile|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/i;
3
+ var DESKTOP_UA_REGEX = /Windows NT|Macintosh|X11|CrOS/i;
4
+ var MOBILE_PLATFORM_HINTS = ["android", "ios"];
5
+ var DESKTOP_PLATFORM_HINTS = [
6
+ "windows",
7
+ "macos",
8
+ "linux",
9
+ "chrome os"
10
+ ];
11
+ var TUNNELLED_MSS_MIN = 1300;
12
+ var TUNNELLED_MSS_MAX = 1430;
13
+ var MOBILE_SIGNAL_WEIGHTS = {
14
+ userAgentMobile: 3,
15
+ userAgentDesktop: -3,
16
+ clientHintMobile: 3,
17
+ clientHintNotMobile: -3,
18
+ clientHintPlatformMobile: 3,
19
+ clientHintPlatformDesktop: -3,
20
+ touchCapability: 2,
21
+ pointerCapability: -3,
22
+ touchEvents: 2,
23
+ webView: 1,
24
+ network: 1
25
+ };
26
+ var readHeader = (headers, name) => {
27
+ const value = headers?.[name];
28
+ return typeof value === "string" && value !== "" ? value : void 0;
29
+ };
30
+ var deriveMobileVerdict = (signals) => {
31
+ let score = 0;
32
+ let corroborated = false;
33
+ const evidence = [];
34
+ const vote = (name, evidenceName = name) => {
35
+ score += MOBILE_SIGNAL_WEIGHTS[name];
36
+ evidence.push(evidenceName);
37
+ };
38
+ const voteCorroborating = (name, evidenceName = name) => {
39
+ vote(name, evidenceName);
40
+ corroborated = true;
41
+ };
42
+ const userAgent = signals.userAgent ?? "";
43
+ if (MOBILE_UA_REGEX.test(userAgent)) vote("userAgentMobile");
44
+ else if (DESKTOP_UA_REGEX.test(userAgent)) vote("userAgentDesktop");
45
+ const mobileHint = readHeader(signals.headers, "sec-ch-ua-mobile");
46
+ if (mobileHint === "?1") vote("clientHintMobile");
47
+ else if (mobileHint === "?0") vote("clientHintNotMobile");
48
+ const platformHint = readHeader(signals.headers, "sec-ch-ua-platform")?.replaceAll("\"", "").toLowerCase();
49
+ if (platformHint !== void 0) {
50
+ if (MOBILE_PLATFORM_HINTS.includes(platformHint)) vote("clientHintPlatformMobile");
51
+ else if (DESKTOP_PLATFORM_HINTS.includes(platformHint)) vote("clientHintPlatformDesktop");
52
+ }
53
+ if (signals.deviceCapability === "mobile") voteCorroborating("touchCapability");
54
+ else if (signals.deviceCapability === "desktop") vote("pointerCapability");
55
+ if (signals.touchEventCount !== void 0 && signals.touchEventCount > 0) voteCorroborating("touchEvents");
56
+ if (signals.webView === true) voteCorroborating("webView");
57
+ const onCarrier = signals.carrierNetwork === true;
58
+ const tunnelled = signals.tcpMss !== void 0 && signals.tcpMss >= TUNNELLED_MSS_MIN && signals.tcpMss <= TUNNELLED_MSS_MAX;
59
+ if (onCarrier || tunnelled) voteCorroborating("network", onCarrier && tunnelled ? "carrierNetwork+tunnelledMss" : onCarrier ? "carrierNetwork" : "tunnelledMss");
60
+ return {
61
+ isMobile: score >= 3,
62
+ corroborated,
63
+ score,
64
+ evidence
65
+ };
66
+ };
67
+ //#endregion
68
+ export { MOBILE_SIGNAL_WEIGHTS, deriveMobileVerdict };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobileSignals.js","sourceRoot":"","sources":["../../src/utils/mobileSignals.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/provider",
3
- "version": "5.19.2",
3
+ "version": "5.19.4",
4
4
  "author": "PROSOPO LIMITED <info@prosopo.io>",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -10,30 +10,30 @@
10
10
  "dependencies": {
11
11
  "@noble/hashes": "2.4.0",
12
12
  "@polkadot/util": "14.0.3",
13
- "@prosopo/api": "4.7.2",
14
- "@prosopo/api-express-router": "3.2.8",
13
+ "@prosopo/api": "4.7.3",
14
+ "@prosopo/api-express-router": "3.2.9",
15
15
  "@prosopo/api-route": "2.6.64",
16
16
  "@prosopo/audio-assets": "0.2.1",
17
- "@prosopo/captcha-severity": "1.3.0",
18
- "@prosopo/common": "3.2.2",
19
- "@prosopo/database": "4.2.6",
20
- "@prosopo/datasets": "3.2.7",
21
- "@prosopo/env": "3.6.76",
17
+ "@prosopo/captcha-severity": "1.3.2",
18
+ "@prosopo/common": "3.2.3",
19
+ "@prosopo/database": "4.2.7",
20
+ "@prosopo/datasets": "3.2.8",
21
+ "@prosopo/env": "3.6.77",
22
22
  "@prosopo/icon-order-assets": "0.2.1",
23
- "@prosopo/ipinfo": "0.4.20",
24
- "@prosopo/keyring": "2.10.7",
25
- "@prosopo/load-balancer": "2.11.11",
26
- "@prosopo/locale": "3.11.0",
23
+ "@prosopo/ipinfo": "0.4.21",
24
+ "@prosopo/keyring": "2.10.8",
25
+ "@prosopo/load-balancer": "2.11.12",
26
+ "@prosopo/locale": "3.11.1",
27
27
  "@prosopo/logger": "2.1.4",
28
28
  "@prosopo/native-ja4": "0.0.8",
29
29
  "@prosopo/native-merkle": "0.0.7",
30
30
  "@prosopo/native-puzzle": "0.1.2",
31
31
  "@prosopo/puzzle-assets": "0.2.2",
32
32
  "@prosopo/redis-client": "1.0.41",
33
- "@prosopo/types": "5.16.2",
34
- "@prosopo/types-database": "5.10.5",
35
- "@prosopo/types-env": "2.11.22",
36
- "@prosopo/user-access-policy": "3.15.3",
33
+ "@prosopo/types": "5.16.3",
34
+ "@prosopo/types-database": "5.10.6",
35
+ "@prosopo/types-env": "2.11.23",
36
+ "@prosopo/user-access-policy": "3.15.4",
37
37
  "@prosopo/util": "3.3.15",
38
38
  "@prosopo/util-crypto": "13.6.0",
39
39
  "@prosopo/web-bot-auth": "0.1.3",
@@ -50,7 +50,7 @@
50
50
  },
51
51
  "devDependencies": {
52
52
  "@noble/curves": "2.4.0",
53
- "@prosopo/config": "3.4.4",
53
+ "@prosopo/config": "3.4.5",
54
54
  "@types/cors": "2.8.19",
55
55
  "@types/express": "4.17.25",
56
56
  "@types/node": "22.5.5",