@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.
- package/dist/analytics.d.ts +17 -3
- package/dist/analytics.d.ts.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/captcha.d.ts +2 -2
- package/dist/captcha.d.ts.map +1 -1
- package/dist/client.d.ts +0 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/index.js +301 -179
- package/dist/index.mjs +301 -179
- package/package.json +2 -2
package/dist/analytics.d.ts
CHANGED
|
@@ -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
|
|
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>;
|
package/dist/analytics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAM,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AACpC,OAAO,EAAC,IAAI,EAAE,WAAW,EAAC,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,WAAW,GAAG;IACzB,iBAAiB;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,mBAAmB;IACnB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,6BAA6B;IAC7B,MAAM,EAAE,GAAG,CAAC;IACZ,wBAAwB;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oCAAoC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,2BAA2B;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAA;CACrB,CAAA;AAED,iCAAiC;AACjC,qBAAa,IAAK,SAAQ,gBAAgB;IAmB7B,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAlBxC,sBAAsB;IACf,IAAI,EAAG,IAAI,CAAC;IAEnB,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7B,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,yDAAyD;IACzD,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,SAAS,CAAuB;IAC1D,oDAAoD;IACpD,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,EAOrC;gBAEqB,QAAQ,EAAE,QAAQ;IAiBxC;;;;;;;OAOG;IACG,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAsBhE;;;;OAIG;IACH,SAAS,CAAC,IAAI,GAAE,MAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;KAAC,GAAG,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC;IAqBvK;;;;OAIG;IACH,aAAa,CAAC,IAAI,GAAE,MAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
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
|
package/dist/captcha.d.ts.map
CHANGED
|
@@ -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,
|
|
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
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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.
|
|
1166
|
+
return this._meta.progress;
|
|
1143
1167
|
}
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
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) =>
|
|
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(
|
|
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((
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 (
|
|
3023
|
-
|
|
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
|
-
|
|
3026
|
-
|
|
3027
|
-
|
|
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=${
|
|
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.
|
|
3444
|
+
return this.momentum.analytics.actorType;
|
|
3323
3445
|
}
|
|
3324
3446
|
get captchaScore() {
|
|
3325
|
-
return this.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
1162
|
+
return this._meta.progress;
|
|
1139
1163
|
}
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
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) =>
|
|
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(
|
|
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((
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 (
|
|
3019
|
-
|
|
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
|
-
|
|
3022
|
-
|
|
3023
|
-
|
|
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=${
|
|
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.
|
|
3440
|
+
return this.momentum.analytics.actorType;
|
|
3319
3441
|
}
|
|
3320
3442
|
get captchaScore() {
|
|
3321
|
-
return this.
|
|
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.
|
|
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.
|
|
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.
|
|
36
|
+
"@ztimson/utils": "^0.30.10"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^26.1.1",
|