@ztimson/momentum 1.5.7 → 1.5.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.
@@ -12,7 +12,7 @@ export type AnalyticInfo = Meta & {
12
12
  readonly campaign?: string;
13
13
  /** Search term or keywords used in the campaign */
14
14
  readonly term?: string;
15
- /** Specific content that triggered the campaign */
15
+ /** Specific content that triggered the ad */
16
16
  readonly content?: string;
17
17
  };
18
18
  /** Browser information */
@@ -26,6 +26,10 @@ export type AnalyticInfo = Meta & {
26
26
  };
27
27
  /** CAPTCHA score 0-1 (0 = bot, 1 = human) */
28
28
  readonly captcha?: number;
29
+ /** Sequence counter */
30
+ readonly captchaSequence?: number;
31
+ /** Claimed, do not reuse on fingerprint match */
32
+ readonly claimed: boolean;
29
33
  /** User consent for additional tracking */
30
34
  readonly consent?: boolean;
31
35
  /** CPU information */
@@ -51,9 +55,10 @@ export type AnalyticInfo = Meta & {
51
55
  /** Engine version */
52
56
  readonly version?: string;
53
57
  };
58
+ /** Create UID to prevent duplicate analytic IDs */
59
+ readonly fingerprint?: string;
54
60
  /** originating IP */
55
61
  readonly ip?: string;
56
- /** Anonymous token */
57
62
  /** System language */
58
63
  readonly lang?: string;
59
64
  /** JavaScript heap size */
@@ -90,6 +95,8 @@ export type AnalyticInfo = Meta & {
90
95
  readonly tz?: string;
91
96
  /** Original user agent string */
92
97
  readonly ua?: string;
98
+ /** User agent bot score */
99
+ readonly uaScore?: number;
93
100
  };
94
101
  export type IpTrace = {
95
102
  /** Ip trace target */
@@ -133,7 +140,6 @@ export type IpTrace = {
133
140
  /** Registry Unique ID */
134
141
  readonly rdapHandle: string;
135
142
  };
136
- /** Analytics metric */
137
143
  export type Metric<T = any> = {
138
144
  /** Name of metric */
139
145
  name: string;
@@ -160,6 +166,12 @@ export type Performance = {
160
166
  export declare class Analytics extends AssetController<AnalyticInfo> {
161
167
  protected momentum: Momentum;
162
168
  private lastPage?;
169
+ private captcha;
170
+ private captchaSecret?;
171
+ private captchaSequence;
172
+ private captchaUpdate?;
173
+ get captchaScore(): number;
174
+ get actorType(): "unknown" | "human" | "bot";
163
175
  private _ready?;
164
176
  readonly ready: Promise<void>;
165
177
  private _performance;
@@ -180,6 +192,8 @@ export declare class Analytics extends AssetController<AnalyticInfo> {
180
192
  private collectNavigationMetrics;
181
193
  private collectLCPMetrics;
182
194
  private init;
195
+ private updateCaptcha;
196
+ private attestCaptcha;
183
197
  consentPrompt(content?: string): Promise<boolean>;
184
198
  speedTest(format: true, bytes?: number): Promise<string>;
185
199
  speedTest(format?: false, bytes?: number): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/captcha.d.ts CHANGED
@@ -4,11 +4,11 @@ export declare class Captcha {
4
4
  private lastMouse;
5
5
  private velocities;
6
6
  private _score;
7
+ private onScoreChange?;
7
8
  private set score(value);
8
9
  get score(): number;
9
10
  get verdict(): 'unknown' | 'human' | 'bot';
10
- constructor();
11
- private validUserAgent;
11
+ constructor(onScoreChange?: (score: number) => void);
12
12
  update(): void;
13
13
  }
14
14
  //# sourceMappingURL=captcha.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../src/captcha.ts"],"names":[],"mappings":"AAAA,qBAAa,OAAO;IACnB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAoF;IAClG,OAAO,CAAC,SAAS,CAAkD;IACnE,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,MAAM,CAAO;IACrB,OAAO,KAAK,KAAK,QAAwB;IACzC,IAAI,KAAK,WAA0B;IAEnC,IAAI,OAAO,IAAI,SAAS,GAAG,OAAO,GAAG,KAAK,CAIzC;;IAsCD,OAAO,CAAC,cAAc;IAStB,MAAM;CAsFN"}
1
+ {"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../src/captcha.ts"],"names":[],"mappings":"AAAA,qBAAa,OAAO;IACnB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAMZ;IACF,OAAO,CAAC,SAAS,CAAkD;IACnE,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,MAAM,CAAO;IACrB,OAAO,CAAC,aAAa,CAAC,CAA0B;IAEhD,OAAO,KAAK,KAAK,QAKhB;IAED,IAAI,KAAK,WAA0B;IAEnC,IAAI,OAAO,IAAI,SAAS,GAAG,OAAO,GAAG,KAAK,CAIzC;gBAEW,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IA8DnD,MAAM;CA2GN"}
package/dist/client.d.ts CHANGED
@@ -21,7 +21,6 @@ export type Theme = {
21
21
  /** Handle device settings */
22
22
  export declare class Client extends PathEventEmitter {
23
23
  protected momentum: Momentum;
24
- private captcha;
25
24
  private installTimeout;
26
25
  private nativePwaPrompt?;
27
26
  private pendingInstall;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1137,34 +1137,88 @@
1137
1137
  };
1138
1138
  var PromiseProgress = class PromiseProgress extends Promise {
1139
1139
  listeners = [];
1140
- _progress = 0;
1140
+ _meta = {
1141
+ start: Date.now(),
1142
+ end: null,
1143
+ elapsed: 0,
1144
+ speed: 0,
1145
+ progress: 0,
1146
+ size: 0,
1147
+ total: 0,
1148
+ eta: null
1149
+ };
1150
+ get meta() {
1151
+ return this._meta;
1152
+ }
1153
+ get start() {
1154
+ return this._meta.start;
1155
+ }
1156
+ get end() {
1157
+ return this._meta.end;
1158
+ }
1159
+ get elapsed() {
1160
+ return this._meta.elapsed;
1161
+ }
1162
+ get speed() {
1163
+ return this._meta.speed;
1164
+ }
1141
1165
  get progress() {
1142
- return this._progress;
1166
+ return this._meta.progress;
1143
1167
  }
1144
- set progress(p) {
1145
- if (p == this._progress) return;
1146
- this._progress = p;
1147
- this.listeners.forEach((l) => l(p));
1168
+ get size() {
1169
+ return this._meta.size;
1170
+ }
1171
+ get total() {
1172
+ return this._meta.total;
1173
+ }
1174
+ get eta() {
1175
+ return this._meta.eta;
1176
+ }
1177
+ update(size, total) {
1178
+ const elapsed = (Date.now() - this._meta.start) / 1e3;
1179
+ const speed = elapsed ? size / elapsed : 0;
1180
+ const progress = total ? size / total : this._meta.progress;
1181
+ this._meta = {
1182
+ ...this._meta,
1183
+ size,
1184
+ total,
1185
+ progress,
1186
+ elapsed,
1187
+ speed,
1188
+ eta: speed && total ? (total - size) / speed : null
1189
+ };
1190
+ (this.listeners ||= []).forEach((l) => l(this._meta));
1148
1191
  }
1149
1192
  constructor(executor) {
1150
- super((resolve, reject) => executor((value) => resolve(value), (reason) => reject(reason), (progress) => this.progress = progress));
1193
+ super((resolve, reject) => executor((value) => {
1194
+ this._meta = {
1195
+ ...this._meta,
1196
+ end: Date.now()
1197
+ };
1198
+ resolve(value);
1199
+ }, (reason) => {
1200
+ this._meta = {
1201
+ ...this._meta,
1202
+ end: Date.now()
1203
+ };
1204
+ reject(reason);
1205
+ }, (size, total) => this.update(size, total ?? this._meta.total)));
1151
1206
  }
1152
1207
  static from(promise) {
1153
1208
  if (promise instanceof PromiseProgress) return promise;
1154
- return new PromiseProgress((res, rej) => promise.then((...args) => res(...args)).catch((...args) => rej(...args)));
1209
+ return new PromiseProgress((res, rej) => promise.then(res).catch(rej));
1155
1210
  }
1156
1211
  from(promise) {
1157
1212
  const newPromise = PromiseProgress.from(promise);
1158
- this.onProgress((p) => newPromise.progress = p);
1213
+ this.onProgress((m) => newPromise.update(m.size, m.total));
1159
1214
  return newPromise;
1160
1215
  }
1161
1216
  onProgress(callback) {
1162
- this.listeners.push(callback);
1217
+ (this.listeners ||= []).push(callback);
1163
1218
  return this;
1164
1219
  }
1165
1220
  then(res, rej) {
1166
- const resp = super.then(res, rej);
1167
- return this.from(resp);
1221
+ return this.from(super.then(res, rej));
1168
1222
  }
1169
1223
  catch(rej) {
1170
1224
  return this.from(super.catch(rej));
@@ -1213,7 +1267,7 @@
1213
1267
  const formData2 = new FormData();
1214
1268
  options.files.forEach((f) => formData2.append("files", f));
1215
1269
  xhr.withCredentials = !!options.withCredentials;
1216
- xhr.upload.addEventListener("progress", (event) => event.lengthComputable ? prog(event.loaded / event.total) : null);
1270
+ xhr.upload.addEventListener("progress", (event) => event.lengthComputable ? prog(event.loaded, event.total) : null);
1217
1271
  xhr.addEventListener("loadend", () => res(JSONAttemptParse(xhr.responseText)));
1218
1272
  xhr.addEventListener("error", () => rej(JSONAttemptParse(xhr.responseText)));
1219
1273
  xhr.addEventListener("timeout", () => rej({ error: "Request timed out" }));
@@ -2251,6 +2305,182 @@
2251
2305
  }
2252
2306
  };
2253
2307
  //#endregion
2308
+ //#region src/captcha.ts
2309
+ var Captcha = class {
2310
+ start = Date.now();
2311
+ events = {
2312
+ mouse: [],
2313
+ keys: [],
2314
+ clicks: [],
2315
+ scroll: [],
2316
+ focus: []
2317
+ };
2318
+ lastMouse = null;
2319
+ velocities = [];
2320
+ _score = .5;
2321
+ onScoreChange;
2322
+ set score(v) {
2323
+ const next = +Math.max(0, Math.min(1, Number.isFinite(v) ? v : .5)).toFixed(2);
2324
+ if (next == this._score) return;
2325
+ this._score = next;
2326
+ this.onScoreChange?.(next);
2327
+ }
2328
+ get score() {
2329
+ return this._score;
2330
+ }
2331
+ get verdict() {
2332
+ if (this.score >= .45 && this.score <= .55) return "unknown";
2333
+ if (this.score > .5) return "human";
2334
+ return "bot";
2335
+ }
2336
+ constructor(onScoreChange) {
2337
+ this.onScoreChange = onScoreChange;
2338
+ if (typeof window === "undefined" || !document) {
2339
+ this._score = 0;
2340
+ return;
2341
+ }
2342
+ document.addEventListener("pointermove", (e) => {
2343
+ const now = Date.now();
2344
+ const curr = {
2345
+ x: e.clientX,
2346
+ y: e.clientY,
2347
+ t: now
2348
+ };
2349
+ this.events.mouse.push(curr);
2350
+ if (this.lastMouse) {
2351
+ const dt = now - this.lastMouse.t;
2352
+ const dx = curr.x - this.lastMouse.x;
2353
+ const dy = curr.y - this.lastMouse.y;
2354
+ const dist = Math.sqrt(dx * dx + dy * dy);
2355
+ if (dt > 0 && dt < 1e3) this.velocities.push(dist / dt);
2356
+ }
2357
+ this.lastMouse = curr;
2358
+ if (this.events.mouse.length > 80) this.events.mouse.shift();
2359
+ if (this.velocities.length > 40) this.velocities.shift();
2360
+ }, { passive: true });
2361
+ document.addEventListener("keydown", () => {
2362
+ this.events.keys.push(Date.now());
2363
+ if (this.events.keys.length > 30) this.events.keys.shift();
2364
+ this.update();
2365
+ });
2366
+ document.addEventListener("pointerdown", (e) => {
2367
+ this.events.clicks.push({
2368
+ x: e.clientX,
2369
+ y: e.clientY,
2370
+ t: Date.now()
2371
+ });
2372
+ if (this.events.clicks.length > 20) this.events.clicks.shift();
2373
+ this.update();
2374
+ }, { passive: true });
2375
+ window.addEventListener("scroll", () => {
2376
+ this.events.scroll.push({
2377
+ x: window.scrollX,
2378
+ y: window.scrollY,
2379
+ t: Date.now()
2380
+ });
2381
+ if (this.events.scroll.length > 20) this.events.scroll.shift();
2382
+ }, { passive: true });
2383
+ document.addEventListener("visibilitychange", () => {
2384
+ this.events.focus.push({
2385
+ visible: document.visibilityState == "visible",
2386
+ t: Date.now()
2387
+ });
2388
+ if (this.events.focus.length > 20) this.events.focus.shift();
2389
+ this.update();
2390
+ });
2391
+ window.addEventListener("focus", () => {
2392
+ this.events.focus.push({
2393
+ visible: true,
2394
+ t: Date.now()
2395
+ });
2396
+ this.update();
2397
+ });
2398
+ window.addEventListener("blur", () => {
2399
+ this.events.focus.push({
2400
+ visible: false,
2401
+ t: Date.now()
2402
+ });
2403
+ this.update();
2404
+ });
2405
+ setInterval(() => this.update(), 2e3);
2406
+ }
2407
+ update() {
2408
+ if (navigator?.webdriver) {
2409
+ this._score = 0;
2410
+ this.onScoreChange?.(0);
2411
+ return;
2412
+ }
2413
+ let delta = 0;
2414
+ const elapsed = (Date.now() - this.start) / 1e3;
2415
+ delta += elapsed > 30 ? .08 : elapsed > 10 ? .04 : elapsed > 3 ? .01 : -.05;
2416
+ if (this.events.mouse.length >= 6) {
2417
+ const recent = this.events.mouse.slice(-30);
2418
+ const buckets = new Array(8).fill(0);
2419
+ for (let i = 1; i < recent.length; i++) {
2420
+ const dx = recent[i].x - recent[i - 1].x;
2421
+ const dy = recent[i].y - recent[i - 1].y;
2422
+ if (dx == 0 && dy == 0) continue;
2423
+ let angle = Math.atan2(dy, dx);
2424
+ if (angle < 0) angle += Math.PI * 2;
2425
+ buckets[Math.min(7, Math.floor(angle / (Math.PI * 2) * 8))]++;
2426
+ }
2427
+ const total = buckets.reduce((a, b) => a + b, 0);
2428
+ if (total >= 4) {
2429
+ let entropy = 0;
2430
+ for (const count of buckets) {
2431
+ if (!count) continue;
2432
+ const p = count / total;
2433
+ entropy -= p * Math.log2(p);
2434
+ }
2435
+ entropy /= Math.log2(8);
2436
+ if (entropy > .65) delta += .12;
2437
+ else if (entropy > .4) delta += .05;
2438
+ else delta -= .07;
2439
+ }
2440
+ } else if (this.events.mouse.length == 0) delta -= .01;
2441
+ if (this.velocities.length >= 5) {
2442
+ const avg = this.velocities.reduce((a, b) => a + b, 0) / this.velocities.length;
2443
+ const variance = this.velocities.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / this.velocities.length;
2444
+ const cv = avg > 0 ? Math.sqrt(variance) / avg : 0;
2445
+ if (cv > .45) delta += .1;
2446
+ else if (cv > .18) delta += .04;
2447
+ else if (avg > 0) delta -= .08;
2448
+ }
2449
+ if (this.events.clicks.length > 0) {
2450
+ const lastClick = this.events.clicks.at(-1);
2451
+ const mouseBeforeClick = this.events.mouse.some((m) => m.t < lastClick.t && lastClick.t - m.t < 2e3);
2452
+ delta += mouseBeforeClick ? .06 : -.08;
2453
+ const suspiciousClicks = this.events.clicks.filter((c) => Number.isInteger(c.x) && Number.isInteger(c.y) && c.x % 10 == 0 && c.y % 10 == 0).length;
2454
+ if (this.events.clicks.length >= 4 && suspiciousClicks / this.events.clicks.length > .5) delta -= .06;
2455
+ }
2456
+ if (this.events.keys.length >= 4) {
2457
+ const intervals = [];
2458
+ for (let i = 1; i < this.events.keys.length; i++) intervals.push(this.events.keys[i] - this.events.keys[i - 1]);
2459
+ const avg = intervals.reduce((a, b) => a + b, 0) / intervals.length;
2460
+ const stdDev = Math.sqrt(intervals.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / intervals.length);
2461
+ if (avg < 20) delta -= .15;
2462
+ else if (stdDev < 5) delta -= .1;
2463
+ else if (avg < 50) delta -= .04;
2464
+ else if (avg < 1e3 && stdDev > 20) delta += .08;
2465
+ }
2466
+ if (this.events.scroll.length >= 4) {
2467
+ let directionChanges = 0;
2468
+ let previousDirection = 0;
2469
+ for (let i = 1; i < this.events.scroll.length; i++) {
2470
+ const direction = Math.sign(this.events.scroll[i].y - this.events.scroll[i - 1].y);
2471
+ if (direction && previousDirection && direction != previousDirection) directionChanges++;
2472
+ if (direction) previousDirection = direction;
2473
+ }
2474
+ if (directionChanges >= 2) delta += .04;
2475
+ }
2476
+ if (this.events.focus.length >= 2) {
2477
+ const visible = this.events.focus.filter((x) => x.visible).length;
2478
+ delta += visible / this.events.focus.length > .4 ? .02 : -.02;
2479
+ }
2480
+ this.score = this.score + delta * .25;
2481
+ }
2482
+ };
2483
+ //#endregion
2254
2484
  //#region src/dialog.ts
2255
2485
  var dialogCount = 0;
2256
2486
  var closed = 0;
@@ -2463,6 +2693,16 @@
2463
2693
  var Analytics = class extends AssetController {
2464
2694
  momentum;
2465
2695
  lastPage;
2696
+ captcha = new Captcha((score) => this.updateCaptcha(score));
2697
+ captchaSecret;
2698
+ captchaSequence = 0;
2699
+ captchaUpdate;
2700
+ get captchaScore() {
2701
+ return this.captcha.score;
2702
+ }
2703
+ get actorType() {
2704
+ return this.captcha.verdict;
2705
+ }
2466
2706
  _ready;
2467
2707
  ready = new Promise((res) => this._ready = res);
2468
2708
  _performance = {
@@ -2541,6 +2781,9 @@
2541
2781
  this._id = "";
2542
2782
  this._consent = void 0;
2543
2783
  this._new = true;
2784
+ this.captchaSecret = void 0;
2785
+ this.captchaSequence = 0;
2786
+ delete this.momentum.api.headers["X-Captcha"];
2544
2787
  });
2545
2788
  this.momentum.auth.on("login:c", async () => {
2546
2789
  if (this.consent) await this.init();
@@ -2617,7 +2860,7 @@
2617
2860
  async init() {
2618
2861
  if (!this.momentum.opts.analytics) return;
2619
2862
  const performance = await this.performance;
2620
- this.id = await this.momentum.api.request({
2863
+ const response = await this.momentum.api.request({
2621
2864
  url: `api/analytics`,
2622
2865
  body: [
2623
2866
  navigator?.language,
@@ -2635,6 +2878,10 @@
2635
2878
  performance.total
2636
2879
  ]
2637
2880
  });
2881
+ this.id = response.id;
2882
+ this.captchaSecret = response.captchaSecret;
2883
+ this.captchaSequence = response.captchaSequence;
2884
+ await this.updateCaptcha(this.captcha.score, true);
2638
2885
  if (this._ready) {
2639
2886
  this._ready();
2640
2887
  this._ready = null;
@@ -2644,6 +2891,25 @@
2644
2891
  window.addEventListener("beforeunload", () => this.page("CLOSED"));
2645
2892
  return this.id;
2646
2893
  }
2894
+ updateCaptcha(score, initial = false) {
2895
+ if (!this.captchaSecret || !this.id || !globalThis.crypto?.subtle) return Promise.resolve();
2896
+ const update = this.captchaUpdate?.catch(() => {}) || Promise.resolve();
2897
+ this.captchaUpdate = update.then(() => this.attestCaptcha(score, initial)).catch(() => {});
2898
+ return this.captchaUpdate;
2899
+ }
2900
+ async attestCaptcha(score, initial) {
2901
+ if (!this.captchaSecret || !this.id) return;
2902
+ if (!initial) this.captchaSequence++;
2903
+ const canonical = Math.max(0, Math.min(1, Number.isFinite(score) ? score : .5)).toFixed(2);
2904
+ const payload = `${canonical}:${this.captchaSequence}`;
2905
+ const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(this.captchaSecret), {
2906
+ name: "HMAC",
2907
+ hash: "SHA-256"
2908
+ }, false, ["sign"]);
2909
+ const signature = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(payload));
2910
+ const proof = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
2911
+ this.momentum.api.headers["X-Captcha"] = `${canonical},${this.captchaSequence},${proof}`;
2912
+ }
2647
2913
  async consentPrompt(content) {
2648
2914
  const settings = await this.momentum.settings.map();
2649
2915
  const { close, dialog, result } = createDialog(`
@@ -3017,19 +3283,29 @@
3017
3283
  loginRedirect(host = location.origin) {
3018
3284
  return new Promise((res, rej) => {
3019
3285
  let listener, win;
3286
+ const loginOrigin = new URL(this.momentum.opts.loginUrl, location.href).origin;
3287
+ const hostOrigin = new URL(host, location.href).origin;
3020
3288
  window.addEventListener("message", listener = async (event) => {
3289
+ if (event.origin !== loginOrigin || event?.data?.sender !== loginOrigin) return;
3021
3290
  const data = event?.data || {};
3022
- if (event.origin != origin || data.sender != origin) return;
3023
- if (!data.token) return rej("Unknown response from login");
3291
+ if (!data.token) {
3292
+ window.removeEventListener("message", listener);
3293
+ return rej(/* @__PURE__ */ new Error("Unknown response from login"));
3294
+ }
3024
3295
  window.removeEventListener("message", listener);
3025
- await this.readSession(data.token, true);
3026
- win.close();
3027
- res(data.token);
3296
+ try {
3297
+ await this.readSession(data.token, true);
3298
+ win?.close();
3299
+ res(data.token);
3300
+ } catch (err) {
3301
+ win?.close();
3302
+ rej(err);
3303
+ }
3028
3304
  });
3029
- win = window.open(`${this.momentum.opts.loginUrl}?redirect=postmessage&host=${encodeURI(host)}`, "_blank");
3305
+ win = window.open(`${this.momentum.opts.loginUrl}?redirect=postmessage&host=${encodeURIComponent(hostOrigin)}`, "_blank");
3030
3306
  if (!win) {
3031
3307
  window.removeEventListener("message", listener);
3032
- return rej("Unable to open login");
3308
+ return rej(/* @__PURE__ */ new Error("Unable to open login"));
3033
3309
  }
3034
3310
  });
3035
3311
  }
@@ -3155,174 +3431,20 @@
3155
3431
  }
3156
3432
  };
3157
3433
  //#endregion
3158
- //#region src/captcha.ts
3159
- var Captcha = class {
3160
- start = Date.now();
3161
- events = {
3162
- mouse: [],
3163
- keys: [],
3164
- clicks: []
3165
- };
3166
- lastMouse = null;
3167
- velocities = [];
3168
- _score = .5;
3169
- set score(v) {
3170
- this._score = v;
3171
- }
3172
- get score() {
3173
- return this._score;
3174
- }
3175
- get verdict() {
3176
- if (this.score == .5) return "unknown";
3177
- if (this.score > .5) return "human";
3178
- return "bot";
3179
- }
3180
- constructor() {
3181
- if (typeof window === "undefined" || !window.innerWidth || !this.validUserAgent()) {
3182
- this.score = 0;
3183
- return;
3184
- }
3185
- document.addEventListener("mousemove", (e) => {
3186
- const now = Date.now();
3187
- const curr = {
3188
- x: e.clientX,
3189
- y: e.clientY,
3190
- t: now
3191
- };
3192
- this.events.mouse.push(curr);
3193
- if (this.lastMouse) {
3194
- const dt = now - this.lastMouse.t;
3195
- const dx = curr.x - this.lastMouse.x;
3196
- const dy = curr.y - this.lastMouse.y;
3197
- const dist = Math.sqrt(dx * dx + dy * dy);
3198
- if (dt > 0) this.velocities.push(dist / dt);
3199
- }
3200
- this.lastMouse = curr;
3201
- if (this.events.mouse.length > 50) this.events.mouse.shift();
3202
- if (this.velocities.length > 30) this.velocities.shift();
3203
- });
3204
- document.addEventListener("keydown", (e) => {
3205
- this.events.keys.push(Date.now());
3206
- if (this.events.keys.length > 20) this.events.keys.shift();
3207
- });
3208
- document.addEventListener("click", (e) => {
3209
- this.events.clicks.push({
3210
- x: e.clientX,
3211
- y: e.clientY,
3212
- t: Date.now()
3213
- });
3214
- if (this.events.clicks.length > 15) this.events.clicks.shift();
3215
- });
3216
- setInterval(() => this.update(), 1e3);
3217
- }
3218
- validUserAgent() {
3219
- if (!navigator?.userAgent) return false;
3220
- const ua = navigator.userAgent.toLowerCase();
3221
- if ([
3222
- "bot",
3223
- "crawler",
3224
- "spider",
3225
- "scraper",
3226
- "headless",
3227
- "phantom",
3228
- "selenium",
3229
- "webdriver",
3230
- "puppeteer",
3231
- "playwright",
3232
- "cypress",
3233
- "automation"
3234
- ].some((pattern) => ua.includes(pattern))) return false;
3235
- if (![
3236
- "chrome",
3237
- "firefox",
3238
- "safari",
3239
- "edge",
3240
- "opera"
3241
- ].some((browser) => ua.includes(browser))) return false;
3242
- if (![
3243
- "windows",
3244
- "mac",
3245
- "linux",
3246
- "android",
3247
- "ios"
3248
- ].some((os) => ua.includes(os))) return false;
3249
- return ua.length > 20 && ua.length < 1e3;
3250
- }
3251
- update() {
3252
- if (navigator.webdriver) {
3253
- this.score = 0;
3254
- return;
3255
- }
3256
- let delta = 0;
3257
- const elapsed = (Date.now() - this.start) / 1e3;
3258
- delta += elapsed > 30 ? .08 : elapsed > 10 ? .04 : elapsed > 3 ? .01 : -.05;
3259
- if (this.events.mouse.length >= 5) {
3260
- const recent = this.events.mouse.slice(-20);
3261
- let changes = 0;
3262
- let maxStraightRun = 0;
3263
- let currentRun = 0;
3264
- for (let i = 2; i < recent.length; i++) {
3265
- const a1 = Math.atan2(recent[i - 1].y - recent[i - 2].y, recent[i - 1].x - recent[i - 2].x);
3266
- const a2 = Math.atan2(recent[i].y - recent[i - 1].y, recent[i].x - recent[i - 1].x);
3267
- if (Math.abs(a1 - a2) > .3) {
3268
- changes++;
3269
- currentRun = 0;
3270
- } else {
3271
- currentRun++;
3272
- maxStraightRun = Math.max(maxStraightRun, currentRun);
3273
- }
3274
- }
3275
- const entropy = changes / (recent.length - 2);
3276
- if (entropy > .4) delta += .12;
3277
- else if (entropy > .2) delta += .05;
3278
- else delta -= .08;
3279
- if (maxStraightRun > 8) delta -= .1;
3280
- } else if (this.events.mouse.length === 0) delta -= .03;
3281
- if (this.velocities.length >= 5) {
3282
- const avg = this.velocities.reduce((a, b) => a + b, 0) / this.velocities.length;
3283
- const variance = this.velocities.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / this.velocities.length;
3284
- const cv = avg > 0 ? Math.sqrt(variance) / avg : 0;
3285
- if (cv > .4) delta += .1;
3286
- else if (cv > .15) delta += .04;
3287
- else if (avg > 0) delta -= .1;
3288
- }
3289
- if (this.events.clicks.length > 0) {
3290
- const lastClick = this.events.clicks[this.events.clicks.length - 1];
3291
- const mouseBeforeClick = this.events.mouse.some((m) => m.t < lastClick.t && lastClick.t - m.t < 2e3);
3292
- delta += mouseBeforeClick ? .08 : -.12;
3293
- if (this.events.clicks.filter((c) => Number.isInteger(c.x) && Number.isInteger(c.y) && c.x % 10 === 0 && c.y % 10 === 0).length / this.events.clicks.length > .5) delta -= .08;
3294
- }
3295
- if (this.events.keys.length >= 3) {
3296
- const intervals = [];
3297
- for (let i = 1; i < this.events.keys.length; i++) intervals.push(this.events.keys[i] - this.events.keys[i - 1]);
3298
- const avg = intervals.reduce((a, b) => a + b, 0) / intervals.length;
3299
- const stdDev = Math.sqrt(intervals.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / intervals.length);
3300
- if (avg < 20) delta -= .15;
3301
- else if (stdDev < 5) delta -= .12;
3302
- else if (avg < 50) delta -= .05;
3303
- else if (avg < 1e3 && stdDev > 20) delta += .1;
3304
- }
3305
- const raw = this.score + delta;
3306
- this.score = this.score * .75 + raw * .25;
3307
- this.score = Math.max(.05, Math.min(.95, this.score));
3308
- }
3309
- };
3310
- //#endregion
3311
3434
  //#region src/client.ts
3312
3435
  /** Handle device settings */
3313
3436
  var Client = class Client extends PathEventEmitter {
3314
3437
  momentum;
3315
- captcha = new Captcha();
3316
3438
  installTimeout;
3317
3439
  nativePwaPrompt;
3318
3440
  pendingInstall = null;
3319
3441
  speed;
3320
3442
  updating = false;
3321
3443
  get actorType() {
3322
- return this.captcha.verdict;
3444
+ return this.momentum.analytics.actorType;
3323
3445
  }
3324
3446
  get captchaScore() {
3325
- return this.captcha.score;
3447
+ return this.momentum.analytics.captchaScore;
3326
3448
  }
3327
3449
  /** Check for updates */
3328
3450
  updateReady = new Promise((res) => {
@@ -4841,7 +4963,7 @@ ${Object.entries(t).map(([name, value]) => `--theme-${kebabCase(name)}: ${value}
4841
4963
  headers: this.momentum.api.headers,
4842
4964
  files: f
4843
4965
  }).onProgress((p) => {
4844
- prog(p);
4966
+ prog(p.progress);
4845
4967
  }).then((resp) => {
4846
4968
  this.emit(PES`${this.module}/${path}:c`, resp);
4847
4969
  res(resp);
@@ -5019,7 +5141,7 @@ ${Object.entries(t).map(([name, value]) => `--theme-${kebabCase(name)}: ${value}
5019
5141
  };
5020
5142
  //#endregion
5021
5143
  //#region package.json
5022
- var version = "1.5.7";
5144
+ var version = "1.5.8";
5023
5145
  //#endregion
5024
5146
  //#region src/webRtc.ts
5025
5147
  var WebRtc = class extends PathEventEmitter {
package/dist/index.mjs CHANGED
@@ -1133,34 +1133,88 @@ var Table = class {
1133
1133
  };
1134
1134
  var PromiseProgress = class PromiseProgress extends Promise {
1135
1135
  listeners = [];
1136
- _progress = 0;
1136
+ _meta = {
1137
+ start: Date.now(),
1138
+ end: null,
1139
+ elapsed: 0,
1140
+ speed: 0,
1141
+ progress: 0,
1142
+ size: 0,
1143
+ total: 0,
1144
+ eta: null
1145
+ };
1146
+ get meta() {
1147
+ return this._meta;
1148
+ }
1149
+ get start() {
1150
+ return this._meta.start;
1151
+ }
1152
+ get end() {
1153
+ return this._meta.end;
1154
+ }
1155
+ get elapsed() {
1156
+ return this._meta.elapsed;
1157
+ }
1158
+ get speed() {
1159
+ return this._meta.speed;
1160
+ }
1137
1161
  get progress() {
1138
- return this._progress;
1162
+ return this._meta.progress;
1139
1163
  }
1140
- set progress(p) {
1141
- if (p == this._progress) return;
1142
- this._progress = p;
1143
- this.listeners.forEach((l) => l(p));
1164
+ get size() {
1165
+ return this._meta.size;
1166
+ }
1167
+ get total() {
1168
+ return this._meta.total;
1169
+ }
1170
+ get eta() {
1171
+ return this._meta.eta;
1172
+ }
1173
+ update(size, total) {
1174
+ const elapsed = (Date.now() - this._meta.start) / 1e3;
1175
+ const speed = elapsed ? size / elapsed : 0;
1176
+ const progress = total ? size / total : this._meta.progress;
1177
+ this._meta = {
1178
+ ...this._meta,
1179
+ size,
1180
+ total,
1181
+ progress,
1182
+ elapsed,
1183
+ speed,
1184
+ eta: speed && total ? (total - size) / speed : null
1185
+ };
1186
+ (this.listeners ||= []).forEach((l) => l(this._meta));
1144
1187
  }
1145
1188
  constructor(executor) {
1146
- super((resolve, reject) => executor((value) => resolve(value), (reason) => reject(reason), (progress) => this.progress = progress));
1189
+ super((resolve, reject) => executor((value) => {
1190
+ this._meta = {
1191
+ ...this._meta,
1192
+ end: Date.now()
1193
+ };
1194
+ resolve(value);
1195
+ }, (reason) => {
1196
+ this._meta = {
1197
+ ...this._meta,
1198
+ end: Date.now()
1199
+ };
1200
+ reject(reason);
1201
+ }, (size, total) => this.update(size, total ?? this._meta.total)));
1147
1202
  }
1148
1203
  static from(promise) {
1149
1204
  if (promise instanceof PromiseProgress) return promise;
1150
- return new PromiseProgress((res, rej) => promise.then((...args) => res(...args)).catch((...args) => rej(...args)));
1205
+ return new PromiseProgress((res, rej) => promise.then(res).catch(rej));
1151
1206
  }
1152
1207
  from(promise) {
1153
1208
  const newPromise = PromiseProgress.from(promise);
1154
- this.onProgress((p) => newPromise.progress = p);
1209
+ this.onProgress((m) => newPromise.update(m.size, m.total));
1155
1210
  return newPromise;
1156
1211
  }
1157
1212
  onProgress(callback) {
1158
- this.listeners.push(callback);
1213
+ (this.listeners ||= []).push(callback);
1159
1214
  return this;
1160
1215
  }
1161
1216
  then(res, rej) {
1162
- const resp = super.then(res, rej);
1163
- return this.from(resp);
1217
+ return this.from(super.then(res, rej));
1164
1218
  }
1165
1219
  catch(rej) {
1166
1220
  return this.from(super.catch(rej));
@@ -1209,7 +1263,7 @@ function uploadWithProgress(options) {
1209
1263
  const formData2 = new FormData();
1210
1264
  options.files.forEach((f) => formData2.append("files", f));
1211
1265
  xhr.withCredentials = !!options.withCredentials;
1212
- xhr.upload.addEventListener("progress", (event) => event.lengthComputable ? prog(event.loaded / event.total) : null);
1266
+ xhr.upload.addEventListener("progress", (event) => event.lengthComputable ? prog(event.loaded, event.total) : null);
1213
1267
  xhr.addEventListener("loadend", () => res(JSONAttemptParse(xhr.responseText)));
1214
1268
  xhr.addEventListener("error", () => rej(JSONAttemptParse(xhr.responseText)));
1215
1269
  xhr.addEventListener("timeout", () => rej({ error: "Request timed out" }));
@@ -2247,6 +2301,182 @@ var Ai = class extends PathEventEmitter {
2247
2301
  }
2248
2302
  };
2249
2303
  //#endregion
2304
+ //#region src/captcha.ts
2305
+ var Captcha = class {
2306
+ start = Date.now();
2307
+ events = {
2308
+ mouse: [],
2309
+ keys: [],
2310
+ clicks: [],
2311
+ scroll: [],
2312
+ focus: []
2313
+ };
2314
+ lastMouse = null;
2315
+ velocities = [];
2316
+ _score = .5;
2317
+ onScoreChange;
2318
+ set score(v) {
2319
+ const next = +Math.max(0, Math.min(1, Number.isFinite(v) ? v : .5)).toFixed(2);
2320
+ if (next == this._score) return;
2321
+ this._score = next;
2322
+ this.onScoreChange?.(next);
2323
+ }
2324
+ get score() {
2325
+ return this._score;
2326
+ }
2327
+ get verdict() {
2328
+ if (this.score >= .45 && this.score <= .55) return "unknown";
2329
+ if (this.score > .5) return "human";
2330
+ return "bot";
2331
+ }
2332
+ constructor(onScoreChange) {
2333
+ this.onScoreChange = onScoreChange;
2334
+ if (typeof window === "undefined" || !document) {
2335
+ this._score = 0;
2336
+ return;
2337
+ }
2338
+ document.addEventListener("pointermove", (e) => {
2339
+ const now = Date.now();
2340
+ const curr = {
2341
+ x: e.clientX,
2342
+ y: e.clientY,
2343
+ t: now
2344
+ };
2345
+ this.events.mouse.push(curr);
2346
+ if (this.lastMouse) {
2347
+ const dt = now - this.lastMouse.t;
2348
+ const dx = curr.x - this.lastMouse.x;
2349
+ const dy = curr.y - this.lastMouse.y;
2350
+ const dist = Math.sqrt(dx * dx + dy * dy);
2351
+ if (dt > 0 && dt < 1e3) this.velocities.push(dist / dt);
2352
+ }
2353
+ this.lastMouse = curr;
2354
+ if (this.events.mouse.length > 80) this.events.mouse.shift();
2355
+ if (this.velocities.length > 40) this.velocities.shift();
2356
+ }, { passive: true });
2357
+ document.addEventListener("keydown", () => {
2358
+ this.events.keys.push(Date.now());
2359
+ if (this.events.keys.length > 30) this.events.keys.shift();
2360
+ this.update();
2361
+ });
2362
+ document.addEventListener("pointerdown", (e) => {
2363
+ this.events.clicks.push({
2364
+ x: e.clientX,
2365
+ y: e.clientY,
2366
+ t: Date.now()
2367
+ });
2368
+ if (this.events.clicks.length > 20) this.events.clicks.shift();
2369
+ this.update();
2370
+ }, { passive: true });
2371
+ window.addEventListener("scroll", () => {
2372
+ this.events.scroll.push({
2373
+ x: window.scrollX,
2374
+ y: window.scrollY,
2375
+ t: Date.now()
2376
+ });
2377
+ if (this.events.scroll.length > 20) this.events.scroll.shift();
2378
+ }, { passive: true });
2379
+ document.addEventListener("visibilitychange", () => {
2380
+ this.events.focus.push({
2381
+ visible: document.visibilityState == "visible",
2382
+ t: Date.now()
2383
+ });
2384
+ if (this.events.focus.length > 20) this.events.focus.shift();
2385
+ this.update();
2386
+ });
2387
+ window.addEventListener("focus", () => {
2388
+ this.events.focus.push({
2389
+ visible: true,
2390
+ t: Date.now()
2391
+ });
2392
+ this.update();
2393
+ });
2394
+ window.addEventListener("blur", () => {
2395
+ this.events.focus.push({
2396
+ visible: false,
2397
+ t: Date.now()
2398
+ });
2399
+ this.update();
2400
+ });
2401
+ setInterval(() => this.update(), 2e3);
2402
+ }
2403
+ update() {
2404
+ if (navigator?.webdriver) {
2405
+ this._score = 0;
2406
+ this.onScoreChange?.(0);
2407
+ return;
2408
+ }
2409
+ let delta = 0;
2410
+ const elapsed = (Date.now() - this.start) / 1e3;
2411
+ delta += elapsed > 30 ? .08 : elapsed > 10 ? .04 : elapsed > 3 ? .01 : -.05;
2412
+ if (this.events.mouse.length >= 6) {
2413
+ const recent = this.events.mouse.slice(-30);
2414
+ const buckets = new Array(8).fill(0);
2415
+ for (let i = 1; i < recent.length; i++) {
2416
+ const dx = recent[i].x - recent[i - 1].x;
2417
+ const dy = recent[i].y - recent[i - 1].y;
2418
+ if (dx == 0 && dy == 0) continue;
2419
+ let angle = Math.atan2(dy, dx);
2420
+ if (angle < 0) angle += Math.PI * 2;
2421
+ buckets[Math.min(7, Math.floor(angle / (Math.PI * 2) * 8))]++;
2422
+ }
2423
+ const total = buckets.reduce((a, b) => a + b, 0);
2424
+ if (total >= 4) {
2425
+ let entropy = 0;
2426
+ for (const count of buckets) {
2427
+ if (!count) continue;
2428
+ const p = count / total;
2429
+ entropy -= p * Math.log2(p);
2430
+ }
2431
+ entropy /= Math.log2(8);
2432
+ if (entropy > .65) delta += .12;
2433
+ else if (entropy > .4) delta += .05;
2434
+ else delta -= .07;
2435
+ }
2436
+ } else if (this.events.mouse.length == 0) delta -= .01;
2437
+ if (this.velocities.length >= 5) {
2438
+ const avg = this.velocities.reduce((a, b) => a + b, 0) / this.velocities.length;
2439
+ const variance = this.velocities.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / this.velocities.length;
2440
+ const cv = avg > 0 ? Math.sqrt(variance) / avg : 0;
2441
+ if (cv > .45) delta += .1;
2442
+ else if (cv > .18) delta += .04;
2443
+ else if (avg > 0) delta -= .08;
2444
+ }
2445
+ if (this.events.clicks.length > 0) {
2446
+ const lastClick = this.events.clicks.at(-1);
2447
+ const mouseBeforeClick = this.events.mouse.some((m) => m.t < lastClick.t && lastClick.t - m.t < 2e3);
2448
+ delta += mouseBeforeClick ? .06 : -.08;
2449
+ const suspiciousClicks = this.events.clicks.filter((c) => Number.isInteger(c.x) && Number.isInteger(c.y) && c.x % 10 == 0 && c.y % 10 == 0).length;
2450
+ if (this.events.clicks.length >= 4 && suspiciousClicks / this.events.clicks.length > .5) delta -= .06;
2451
+ }
2452
+ if (this.events.keys.length >= 4) {
2453
+ const intervals = [];
2454
+ for (let i = 1; i < this.events.keys.length; i++) intervals.push(this.events.keys[i] - this.events.keys[i - 1]);
2455
+ const avg = intervals.reduce((a, b) => a + b, 0) / intervals.length;
2456
+ const stdDev = Math.sqrt(intervals.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / intervals.length);
2457
+ if (avg < 20) delta -= .15;
2458
+ else if (stdDev < 5) delta -= .1;
2459
+ else if (avg < 50) delta -= .04;
2460
+ else if (avg < 1e3 && stdDev > 20) delta += .08;
2461
+ }
2462
+ if (this.events.scroll.length >= 4) {
2463
+ let directionChanges = 0;
2464
+ let previousDirection = 0;
2465
+ for (let i = 1; i < this.events.scroll.length; i++) {
2466
+ const direction = Math.sign(this.events.scroll[i].y - this.events.scroll[i - 1].y);
2467
+ if (direction && previousDirection && direction != previousDirection) directionChanges++;
2468
+ if (direction) previousDirection = direction;
2469
+ }
2470
+ if (directionChanges >= 2) delta += .04;
2471
+ }
2472
+ if (this.events.focus.length >= 2) {
2473
+ const visible = this.events.focus.filter((x) => x.visible).length;
2474
+ delta += visible / this.events.focus.length > .4 ? .02 : -.02;
2475
+ }
2476
+ this.score = this.score + delta * .25;
2477
+ }
2478
+ };
2479
+ //#endregion
2250
2480
  //#region src/dialog.ts
2251
2481
  var dialogCount = 0;
2252
2482
  var closed = 0;
@@ -2459,6 +2689,16 @@ function createDialog(html, opts = {}) {
2459
2689
  var Analytics = class extends AssetController {
2460
2690
  momentum;
2461
2691
  lastPage;
2692
+ captcha = new Captcha((score) => this.updateCaptcha(score));
2693
+ captchaSecret;
2694
+ captchaSequence = 0;
2695
+ captchaUpdate;
2696
+ get captchaScore() {
2697
+ return this.captcha.score;
2698
+ }
2699
+ get actorType() {
2700
+ return this.captcha.verdict;
2701
+ }
2462
2702
  _ready;
2463
2703
  ready = new Promise((res) => this._ready = res);
2464
2704
  _performance = {
@@ -2537,6 +2777,9 @@ var Analytics = class extends AssetController {
2537
2777
  this._id = "";
2538
2778
  this._consent = void 0;
2539
2779
  this._new = true;
2780
+ this.captchaSecret = void 0;
2781
+ this.captchaSequence = 0;
2782
+ delete this.momentum.api.headers["X-Captcha"];
2540
2783
  });
2541
2784
  this.momentum.auth.on("login:c", async () => {
2542
2785
  if (this.consent) await this.init();
@@ -2613,7 +2856,7 @@ var Analytics = class extends AssetController {
2613
2856
  async init() {
2614
2857
  if (!this.momentum.opts.analytics) return;
2615
2858
  const performance = await this.performance;
2616
- this.id = await this.momentum.api.request({
2859
+ const response = await this.momentum.api.request({
2617
2860
  url: `api/analytics`,
2618
2861
  body: [
2619
2862
  navigator?.language,
@@ -2631,6 +2874,10 @@ var Analytics = class extends AssetController {
2631
2874
  performance.total
2632
2875
  ]
2633
2876
  });
2877
+ this.id = response.id;
2878
+ this.captchaSecret = response.captchaSecret;
2879
+ this.captchaSequence = response.captchaSequence;
2880
+ await this.updateCaptcha(this.captcha.score, true);
2634
2881
  if (this._ready) {
2635
2882
  this._ready();
2636
2883
  this._ready = null;
@@ -2640,6 +2887,25 @@ var Analytics = class extends AssetController {
2640
2887
  window.addEventListener("beforeunload", () => this.page("CLOSED"));
2641
2888
  return this.id;
2642
2889
  }
2890
+ updateCaptcha(score, initial = false) {
2891
+ if (!this.captchaSecret || !this.id || !globalThis.crypto?.subtle) return Promise.resolve();
2892
+ const update = this.captchaUpdate?.catch(() => {}) || Promise.resolve();
2893
+ this.captchaUpdate = update.then(() => this.attestCaptcha(score, initial)).catch(() => {});
2894
+ return this.captchaUpdate;
2895
+ }
2896
+ async attestCaptcha(score, initial) {
2897
+ if (!this.captchaSecret || !this.id) return;
2898
+ if (!initial) this.captchaSequence++;
2899
+ const canonical = Math.max(0, Math.min(1, Number.isFinite(score) ? score : .5)).toFixed(2);
2900
+ const payload = `${canonical}:${this.captchaSequence}`;
2901
+ const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(this.captchaSecret), {
2902
+ name: "HMAC",
2903
+ hash: "SHA-256"
2904
+ }, false, ["sign"]);
2905
+ const signature = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(payload));
2906
+ const proof = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
2907
+ this.momentum.api.headers["X-Captcha"] = `${canonical},${this.captchaSequence},${proof}`;
2908
+ }
2643
2909
  async consentPrompt(content) {
2644
2910
  const settings = await this.momentum.settings.map();
2645
2911
  const { close, dialog, result } = createDialog(`
@@ -3013,19 +3279,29 @@ var Auth = class extends PathEventEmitter {
3013
3279
  loginRedirect(host = location.origin) {
3014
3280
  return new Promise((res, rej) => {
3015
3281
  let listener, win;
3282
+ const loginOrigin = new URL(this.momentum.opts.loginUrl, location.href).origin;
3283
+ const hostOrigin = new URL(host, location.href).origin;
3016
3284
  window.addEventListener("message", listener = async (event) => {
3285
+ if (event.origin !== loginOrigin || event?.data?.sender !== loginOrigin) return;
3017
3286
  const data = event?.data || {};
3018
- if (event.origin != origin || data.sender != origin) return;
3019
- if (!data.token) return rej("Unknown response from login");
3287
+ if (!data.token) {
3288
+ window.removeEventListener("message", listener);
3289
+ return rej(/* @__PURE__ */ new Error("Unknown response from login"));
3290
+ }
3020
3291
  window.removeEventListener("message", listener);
3021
- await this.readSession(data.token, true);
3022
- win.close();
3023
- res(data.token);
3292
+ try {
3293
+ await this.readSession(data.token, true);
3294
+ win?.close();
3295
+ res(data.token);
3296
+ } catch (err) {
3297
+ win?.close();
3298
+ rej(err);
3299
+ }
3024
3300
  });
3025
- win = window.open(`${this.momentum.opts.loginUrl}?redirect=postmessage&host=${encodeURI(host)}`, "_blank");
3301
+ win = window.open(`${this.momentum.opts.loginUrl}?redirect=postmessage&host=${encodeURIComponent(hostOrigin)}`, "_blank");
3026
3302
  if (!win) {
3027
3303
  window.removeEventListener("message", listener);
3028
- return rej("Unable to open login");
3304
+ return rej(/* @__PURE__ */ new Error("Unable to open login"));
3029
3305
  }
3030
3306
  });
3031
3307
  }
@@ -3151,174 +3427,20 @@ var Call = class extends PathEventEmitter {
3151
3427
  }
3152
3428
  };
3153
3429
  //#endregion
3154
- //#region src/captcha.ts
3155
- var Captcha = class {
3156
- start = Date.now();
3157
- events = {
3158
- mouse: [],
3159
- keys: [],
3160
- clicks: []
3161
- };
3162
- lastMouse = null;
3163
- velocities = [];
3164
- _score = .5;
3165
- set score(v) {
3166
- this._score = v;
3167
- }
3168
- get score() {
3169
- return this._score;
3170
- }
3171
- get verdict() {
3172
- if (this.score == .5) return "unknown";
3173
- if (this.score > .5) return "human";
3174
- return "bot";
3175
- }
3176
- constructor() {
3177
- if (typeof window === "undefined" || !window.innerWidth || !this.validUserAgent()) {
3178
- this.score = 0;
3179
- return;
3180
- }
3181
- document.addEventListener("mousemove", (e) => {
3182
- const now = Date.now();
3183
- const curr = {
3184
- x: e.clientX,
3185
- y: e.clientY,
3186
- t: now
3187
- };
3188
- this.events.mouse.push(curr);
3189
- if (this.lastMouse) {
3190
- const dt = now - this.lastMouse.t;
3191
- const dx = curr.x - this.lastMouse.x;
3192
- const dy = curr.y - this.lastMouse.y;
3193
- const dist = Math.sqrt(dx * dx + dy * dy);
3194
- if (dt > 0) this.velocities.push(dist / dt);
3195
- }
3196
- this.lastMouse = curr;
3197
- if (this.events.mouse.length > 50) this.events.mouse.shift();
3198
- if (this.velocities.length > 30) this.velocities.shift();
3199
- });
3200
- document.addEventListener("keydown", (e) => {
3201
- this.events.keys.push(Date.now());
3202
- if (this.events.keys.length > 20) this.events.keys.shift();
3203
- });
3204
- document.addEventListener("click", (e) => {
3205
- this.events.clicks.push({
3206
- x: e.clientX,
3207
- y: e.clientY,
3208
- t: Date.now()
3209
- });
3210
- if (this.events.clicks.length > 15) this.events.clicks.shift();
3211
- });
3212
- setInterval(() => this.update(), 1e3);
3213
- }
3214
- validUserAgent() {
3215
- if (!navigator?.userAgent) return false;
3216
- const ua = navigator.userAgent.toLowerCase();
3217
- if ([
3218
- "bot",
3219
- "crawler",
3220
- "spider",
3221
- "scraper",
3222
- "headless",
3223
- "phantom",
3224
- "selenium",
3225
- "webdriver",
3226
- "puppeteer",
3227
- "playwright",
3228
- "cypress",
3229
- "automation"
3230
- ].some((pattern) => ua.includes(pattern))) return false;
3231
- if (![
3232
- "chrome",
3233
- "firefox",
3234
- "safari",
3235
- "edge",
3236
- "opera"
3237
- ].some((browser) => ua.includes(browser))) return false;
3238
- if (![
3239
- "windows",
3240
- "mac",
3241
- "linux",
3242
- "android",
3243
- "ios"
3244
- ].some((os) => ua.includes(os))) return false;
3245
- return ua.length > 20 && ua.length < 1e3;
3246
- }
3247
- update() {
3248
- if (navigator.webdriver) {
3249
- this.score = 0;
3250
- return;
3251
- }
3252
- let delta = 0;
3253
- const elapsed = (Date.now() - this.start) / 1e3;
3254
- delta += elapsed > 30 ? .08 : elapsed > 10 ? .04 : elapsed > 3 ? .01 : -.05;
3255
- if (this.events.mouse.length >= 5) {
3256
- const recent = this.events.mouse.slice(-20);
3257
- let changes = 0;
3258
- let maxStraightRun = 0;
3259
- let currentRun = 0;
3260
- for (let i = 2; i < recent.length; i++) {
3261
- const a1 = Math.atan2(recent[i - 1].y - recent[i - 2].y, recent[i - 1].x - recent[i - 2].x);
3262
- const a2 = Math.atan2(recent[i].y - recent[i - 1].y, recent[i].x - recent[i - 1].x);
3263
- if (Math.abs(a1 - a2) > .3) {
3264
- changes++;
3265
- currentRun = 0;
3266
- } else {
3267
- currentRun++;
3268
- maxStraightRun = Math.max(maxStraightRun, currentRun);
3269
- }
3270
- }
3271
- const entropy = changes / (recent.length - 2);
3272
- if (entropy > .4) delta += .12;
3273
- else if (entropy > .2) delta += .05;
3274
- else delta -= .08;
3275
- if (maxStraightRun > 8) delta -= .1;
3276
- } else if (this.events.mouse.length === 0) delta -= .03;
3277
- if (this.velocities.length >= 5) {
3278
- const avg = this.velocities.reduce((a, b) => a + b, 0) / this.velocities.length;
3279
- const variance = this.velocities.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / this.velocities.length;
3280
- const cv = avg > 0 ? Math.sqrt(variance) / avg : 0;
3281
- if (cv > .4) delta += .1;
3282
- else if (cv > .15) delta += .04;
3283
- else if (avg > 0) delta -= .1;
3284
- }
3285
- if (this.events.clicks.length > 0) {
3286
- const lastClick = this.events.clicks[this.events.clicks.length - 1];
3287
- const mouseBeforeClick = this.events.mouse.some((m) => m.t < lastClick.t && lastClick.t - m.t < 2e3);
3288
- delta += mouseBeforeClick ? .08 : -.12;
3289
- if (this.events.clicks.filter((c) => Number.isInteger(c.x) && Number.isInteger(c.y) && c.x % 10 === 0 && c.y % 10 === 0).length / this.events.clicks.length > .5) delta -= .08;
3290
- }
3291
- if (this.events.keys.length >= 3) {
3292
- const intervals = [];
3293
- for (let i = 1; i < this.events.keys.length; i++) intervals.push(this.events.keys[i] - this.events.keys[i - 1]);
3294
- const avg = intervals.reduce((a, b) => a + b, 0) / intervals.length;
3295
- const stdDev = Math.sqrt(intervals.reduce((a, b) => a + Math.pow(b - avg, 2), 0) / intervals.length);
3296
- if (avg < 20) delta -= .15;
3297
- else if (stdDev < 5) delta -= .12;
3298
- else if (avg < 50) delta -= .05;
3299
- else if (avg < 1e3 && stdDev > 20) delta += .1;
3300
- }
3301
- const raw = this.score + delta;
3302
- this.score = this.score * .75 + raw * .25;
3303
- this.score = Math.max(.05, Math.min(.95, this.score));
3304
- }
3305
- };
3306
- //#endregion
3307
3430
  //#region src/client.ts
3308
3431
  /** Handle device settings */
3309
3432
  var Client = class Client extends PathEventEmitter {
3310
3433
  momentum;
3311
- captcha = new Captcha();
3312
3434
  installTimeout;
3313
3435
  nativePwaPrompt;
3314
3436
  pendingInstall = null;
3315
3437
  speed;
3316
3438
  updating = false;
3317
3439
  get actorType() {
3318
- return this.captcha.verdict;
3440
+ return this.momentum.analytics.actorType;
3319
3441
  }
3320
3442
  get captchaScore() {
3321
- return this.captcha.score;
3443
+ return this.momentum.analytics.captchaScore;
3322
3444
  }
3323
3445
  /** Check for updates */
3324
3446
  updateReady = new Promise((res) => {
@@ -4837,7 +4959,7 @@ var Storage = class extends PathEventEmitter {
4837
4959
  headers: this.momentum.api.headers,
4838
4960
  files: f
4839
4961
  }).onProgress((p) => {
4840
- prog(p);
4962
+ prog(p.progress);
4841
4963
  }).then((resp) => {
4842
4964
  this.emit(PES`${this.module}/${path}:c`, resp);
4843
4965
  res(resp);
@@ -5015,7 +5137,7 @@ var Static = class extends Storage {
5015
5137
  };
5016
5138
  //#endregion
5017
5139
  //#region package.json
5018
- var version = "1.5.7";
5140
+ var version = "1.5.8";
5019
5141
  //#endregion
5020
5142
  //#region src/webRtc.ts
5021
5143
  var WebRtc = class extends PathEventEmitter {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ztimson/momentum",
3
- "version": "1.5.7",
3
+ "version": "1.5.8",
4
4
  "description": "Client library for momentum",
5
5
  "keywords": [
6
6
  "Momentum"
@@ -33,7 +33,7 @@
33
33
  "postbuild": "npm run build:docs && node -e \"const fs=require('fs');fs.cpSync('dist/index.mjs','../server/public/momentum.mjs');fs.cpSync('dist/index.js','../server/public/momentum.js');fs.cpSync('dist/momentum.worker.mjs','../server/public/momentum.worker.mjs')\""
34
34
  },
35
35
  "dependencies": {
36
- "@ztimson/utils": "^0.30.8"
36
+ "@ztimson/utils": "^0.30.10"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^26.1.1",