@prosopo/provider 5.10.2 → 5.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +13 -12
  2. package/.turbo/turbo-build$colon$tsc.log +27 -27
  3. package/.turbo/turbo-build.log +14 -13
  4. package/CHANGELOG.md +68 -0
  5. package/dist/api/assetDocument.d.ts +3 -0
  6. package/dist/api/assetDocument.d.ts.map +1 -0
  7. package/dist/api/assetDocument.js +41 -0
  8. package/dist/api/assetDocument.js.map +1 -0
  9. package/dist/api/captcha/assignDetectorBundle.d.ts.map +1 -1
  10. package/dist/api/captcha/assignDetectorBundle.js +24 -2
  11. package/dist/api/captcha/assignDetectorBundle.js.map +1 -1
  12. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  13. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +2 -1
  14. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  15. package/dist/api/public.d.ts.map +1 -1
  16. package/dist/api/public.js +2 -0
  17. package/dist/api/public.js.map +1 -1
  18. package/dist/cjs/api/assetDocument.cjs +43 -0
  19. package/dist/cjs/api/captcha/assignDetectorBundle.cjs +23 -1
  20. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +2 -1
  21. package/dist/cjs/api/public.cjs +2 -0
  22. package/dist/cjs/tasks/captchaManager.cjs +2 -1
  23. package/dist/cjs/tasks/decisionMachine/decisionMachineRunner.cjs +20 -17
  24. package/dist/cjs/tasks/detection/bundlePool.cjs +7 -4
  25. package/dist/cjs/tasks/detection/decodePayload.cjs +1139 -1120
  26. package/dist/cjs/tasks/detection/decodePayload.js +1 -1
  27. package/dist/cjs/tasks/detection/getBotScore.cjs +2 -2
  28. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +7 -2
  29. package/dist/tasks/captchaManager.d.ts +1 -0
  30. package/dist/tasks/captchaManager.d.ts.map +1 -1
  31. package/dist/tasks/captchaManager.js +2 -1
  32. package/dist/tasks/captchaManager.js.map +1 -1
  33. package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts +2 -0
  34. package/dist/tasks/decisionMachine/decisionMachineRunner.d.ts.map +1 -1
  35. package/dist/tasks/decisionMachine/decisionMachineRunner.js +20 -17
  36. package/dist/tasks/decisionMachine/decisionMachineRunner.js.map +1 -1
  37. package/dist/tasks/detection/bundlePool.d.ts +1 -0
  38. package/dist/tasks/detection/bundlePool.d.ts.map +1 -1
  39. package/dist/tasks/detection/bundlePool.js +7 -4
  40. package/dist/tasks/detection/bundlePool.js.map +1 -1
  41. package/dist/tasks/detection/bundlePool.test.js +36 -0
  42. package/dist/tasks/detection/bundlePool.test.js.map +1 -1
  43. package/dist/tasks/detection/decodePayload.d.ts +2 -2
  44. package/dist/tasks/detection/decodePayload.d.ts.map +1 -1
  45. package/dist/tasks/detection/decodePayload.js +1 -1
  46. package/dist/tasks/detection/decodePayload.js.map +1 -1
  47. package/dist/tasks/detection/getBotScore.d.ts +1 -1
  48. package/dist/tasks/detection/getBotScore.d.ts.map +1 -1
  49. package/dist/tasks/detection/getBotScore.js +3 -3
  50. package/dist/tasks/detection/getBotScore.js.map +1 -1
  51. package/dist/tasks/frictionless/frictionlessTasks.d.ts +2 -0
  52. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  53. package/dist/tasks/frictionless/frictionlessTasks.js +7 -2
  54. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  55. package/dist/tests/integration/decisionMachines.integration.test.js +65 -1
  56. package/dist/tests/integration/decisionMachines.integration.test.js.map +1 -1
  57. package/dist/tests/unit/api/assetDocument.unit.test.d.ts +2 -0
  58. package/dist/tests/unit/api/assetDocument.unit.test.d.ts.map +1 -0
  59. package/dist/tests/unit/api/assetDocument.unit.test.js +55 -0
  60. package/dist/tests/unit/api/assetDocument.unit.test.js.map +1 -0
  61. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +5 -3
  62. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  63. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +10 -9
  64. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  65. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +9 -3
  66. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
  67. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +11 -6
  68. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -1
  69. package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js +38 -0
  70. package/dist/tests/unit/tasks/decisionMachine/decisionMachineRunner.unit.test.js.map +1 -1
  71. package/dist/tests/unit/tasks/detection/getBotScore.unit.test.js +3 -3
  72. package/dist/tests/unit/tasks/detection/getBotScore.unit.test.js.map +1 -1
  73. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js +6 -0
  74. package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js.map +1 -1
  75. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +78 -84
  76. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  77. package/package.json +28 -28
@@ -1,4 +1,5 @@
1
1
  import { metricsEnabled, metricsHandler, recordHealthzGeoOutcome } from "./metrics.js";
2
+ import { assetDocumentRouter } from "./assetDocument.js";
2
3
  import { getHealthzGeoRouter } from "./healthzGeo.js";
3
4
  import { ProsopoApiError } from "@prosopo/common";
4
5
  import { PublicApiPaths } from "@prosopo/types";
@@ -61,6 +62,7 @@ function publicRouter(env) {
61
62
  return next(new ProsopoApiError("API.BAD_REQUEST", { context: { code: 500 } }));
62
63
  }
63
64
  });
65
+ router.use(assetDocumentRouter());
64
66
  router.use(handleErrors);
65
67
  return router;
66
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/api/public.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/api/public.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let express = require("express");
3
+ express = require_runtime.__toESM(express, 1);
4
+ //#region src/api/assetDocument.ts
5
+ var scriptLiteral = (value) => JSON.stringify(value).replace(/</g, "\\u003c").replace(/>/g, "\\u003e");
6
+ var page = (inner, id) => `<!doctype html>
7
+ <meta charset="utf-8">
8
+ <body><script>
9
+ var f=document.createElement('iframe');
10
+ f.src=${scriptLiteral(inner)};
11
+ f.onload=function(){window.top.postMessage({p:'n',i:${scriptLiteral(id)}},'*')};
12
+ document.body.appendChild(f);
13
+ <\/script></body>`;
14
+ var ID_PATTERN = /^[A-Za-z0-9]{1,64}$/;
15
+ var probeId = (raw) => "string" === typeof raw && ID_PATTERN.test(raw) ? raw : "";
16
+ var innerUrl = (raw) => {
17
+ if ("string" !== typeof raw || 0 === raw.length) return;
18
+ try {
19
+ const url = new URL(raw);
20
+ return "http:" === url.protocol || "https:" === url.protocol ? url.href : void 0;
21
+ } catch {
22
+ return;
23
+ }
24
+ };
25
+ function assetDocumentRouter() {
26
+ const router = express.default.Router();
27
+ router.get(/.*/, (req, res, next) => {
28
+ if ("n" !== req.query.m) return next();
29
+ const inner = innerUrl(req.query.u);
30
+ if (!inner) return next();
31
+ const id = probeId(req.query.i);
32
+ res.removeHeader("X-Frame-Options");
33
+ res.set({
34
+ "Content-Type": "text/html; charset=utf-8",
35
+ "Cache-Control": "no-store",
36
+ "Content-Security-Policy": "frame-ancestors *"
37
+ });
38
+ return res.status(200).send(page(inner, id));
39
+ });
40
+ return router;
41
+ }
42
+ //#endregion
43
+ exports.assetDocumentRouter = assetDocumentRouter;
@@ -8,6 +8,26 @@ let uuid = require("uuid");
8
8
  //#region src/api/captcha/assignDetectorBundle.ts
9
9
  /** Pool position for this caller: a keyed hash of their address. */
10
10
  var clientIndex = (ip, secret) => (0, node_crypto.createHmac)("sha256", secret).update(ip).digest().readUIntBE(0, 6);
11
+ var siteConfig = async (tasks, body, logger) => {
12
+ const parsed = _prosopo_types.AssignDetectorBundleRequestBody.safeParse(body);
13
+ if (!parsed.success) return {};
14
+ try {
15
+ const client = await tasks.db.getClientRecord(parsed.data[_prosopo_types.ApiParams.dapp]);
16
+ const clientUrl = client?.settings?.clientUrl;
17
+ const assetOrigin = client?.settings?.assetOrigin;
18
+ if (!clientUrl || !assetOrigin) return {};
19
+ return {
20
+ [_prosopo_types.ApiParams.clientUrl]: clientUrl,
21
+ [_prosopo_types.ApiParams.assetOrigin]: assetOrigin
22
+ };
23
+ } catch (err) {
24
+ logger.warn(() => ({
25
+ msg: "assignDetectorBundle site config failed",
26
+ err
27
+ }));
28
+ return {};
29
+ }
30
+ };
11
31
  /**
12
32
  * Assigns a precomputed detector bundle for this detection session.
13
33
  *
@@ -43,13 +63,15 @@ var assignDetectorBundle_default = (env) => async (req, res, _next) => {
43
63
  });
44
64
  const { bundleId, bundle } = pool.at(clientIndex(require_normalizeRequestIp.normalizeRequestIp(req.ip, req.logger), secret));
45
65
  const detectorSessionId = `det-${(0, uuid.v4)()}`;
46
- const writeQueue = new require_tasks.Tasks(env, req.logger).frictionlessManager.writeQueue;
66
+ const tasks = new require_tasks.Tasks(env, req.logger);
67
+ const writeQueue = tasks.frictionlessManager.writeQueue;
47
68
  if (!writeQueue) return res.json(noBundle);
48
69
  if (!await writeQueue.cacheDetectorBundle(detectorSessionId, bundleId)) return res.json(noBundle);
49
70
  const response = {
50
71
  [_prosopo_types.ApiParams.useProviderBundle]: true,
51
72
  [_prosopo_types.ApiParams.detectorSessionId]: detectorSessionId,
52
73
  [_prosopo_types.ApiParams.detectorScript]: bundle.js,
74
+ ...await siteConfig(tasks, req.body, req.logger),
53
75
  status: "ok"
54
76
  };
55
77
  return res.json(response);
@@ -267,7 +267,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
267
267
  ...verifiedSignerUrl && { agent: verifiedSignerUrl }
268
268
  });
269
269
  }
270
- const { baseBotScore: rawBaseBotScore, timestamp: rawTimestamp, userId: rawUserId, userAgent: rawUserAgent, webView, iFrame, decryptedHeadHash, decryptionFailed: rawDecryptionFailed, triggeredDetectors, shadowDomPenalty, entropyMathRandomFingerprint, entropyCryptoFingerprint, entropyWallClockOffsetMs, entropyMathRandomFirst, g, i, cv, sq, cg, sm, b, sw, md, bn, fs, bundleId } = decryptedPayload;
270
+ const { baseBotScore: rawBaseBotScore, timestamp: rawTimestamp, userId: rawUserId, userAgent: rawUserAgent, webView, iFrame, decryptedHeadHash, decryptionFailed: rawDecryptionFailed, triggeredDetectors, shadowDomPenalty, entropyMathRandomFingerprint, entropyCryptoFingerprint, entropyWallClockOffsetMs, entropyMathRandomFirst, g, i, cv, sq, cg, sm, dz, b, sw, md, bn, fs, bundleId } = decryptedPayload;
271
271
  const detectorOverride = process.env.PROSOPO_TEST_FRICTIONLESS_DETECTOR_OVERRIDE === "1";
272
272
  const baseBotScore = detectorOverride ? 0 : rawBaseBotScore;
273
273
  const timestamp = detectorOverride ? Date.now() : rawTimestamp;
@@ -333,6 +333,7 @@ var handler_default = (env, userAccessRulesStorage) => async (req, res, next) =>
333
333
  ...sq !== void 0 && { sq },
334
334
  ...cg !== void 0 && { cg },
335
335
  ...sm !== void 0 && { sm },
336
+ ...dz !== void 0 && { dz },
336
337
  ...b !== void 0 && { b },
337
338
  ...sw !== void 0 && { sw },
338
339
  ...md !== void 0 && { md },
@@ -1,5 +1,6 @@
1
1
  const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
2
  const require_metrics = require("./metrics.cjs");
3
+ const require_assetDocument = require("./assetDocument.cjs");
3
4
  const require_healthzGeo = require("./healthzGeo.cjs");
4
5
  let _prosopo_common = require("@prosopo/common");
5
6
  let _prosopo_types = require("@prosopo/types");
@@ -64,6 +65,7 @@ function publicRouter(env) {
64
65
  return next(new _prosopo_common.ProsopoApiError("API.BAD_REQUEST", { context: { code: 500 } }));
65
66
  }
66
67
  });
68
+ router.use(require_assetDocument.assetDocumentRouter());
67
69
  router.use(_prosopo_api_express_router.handleErrors);
68
70
  return router;
69
71
  }
@@ -345,7 +345,8 @@ var CaptchaManager = class CaptchaManager {
345
345
  const bundle = bundleId ? require_bundlePool.getDetectorBundlePool()?.get(bundleId) : void 0;
346
346
  return bundle ? {
347
347
  key: bundle.privateKey,
348
- innerConfig: bundle.innerConfig
348
+ innerConfig: bundle.innerConfig,
349
+ ...bundle.payloadLayout && { payloadLayout: bundle.payloadLayout }
349
350
  } : void 0;
350
351
  }
351
352
  /**
@@ -43,46 +43,49 @@ var ARTIFACT_CACHE_TTL_MS = Number.parseInt(process.env.DECISION_MACHINE_ARTIFAC
43
43
  var DEFAULT_DECISION = { decision: _prosopo_types.DecisionMachineDecision.Allow };
44
44
  var RequiredCountersSchema = zod.z.array(_prosopo_types.CounterSpecSchema);
45
45
  /**
46
- * WeakSet-style registry of every live runner. Populated in the constructor
47
- * and consulted by {@link invalidateAllDecisionMachineArtifactCaches} so an
48
- * artifact upload can flush every runner's in-memory artifact cache in one
49
- * call. Held as `WeakRef` so a runner that goes out of scope is garbage
50
- * collected — this map only ever grows in prod (runners are constructed
51
- * per task class at process start and live for the process's lifetime) so
52
- * a plain array would also work, but `WeakRef` is defensive.
46
+ * Bumped by {@link invalidateAllDecisionMachineArtifactCaches}. A runner
47
+ * caches the value it last saw and drops its artifact cache whenever the two
48
+ * diverge, which flushes every runner — including ones built after the
49
+ * invalidation — without holding a reference to any of them.
50
+ *
51
+ * This replaces a registry of live runners, which assumed runners were built
52
+ * once per process. They are built per request, so the registry grew without
53
+ * bound and construction eventually began to fail. `WeakRef` did not bound
54
+ * it: the set held the wrapper, which outlives its referent.
53
55
  */
54
- var liveRunners = /* @__PURE__ */ new Set();
56
+ var artifactCacheGeneration = 0;
55
57
  /**
56
58
  * Flush every runner's in-memory artifact cache. Companion to
57
59
  * {@link invalidateDecisionMachineScriptCache}. Call both after any
58
60
  * `upsertDecisionMachineArtifact` upload.
59
61
  */
60
62
  var invalidateAllDecisionMachineArtifactCaches = () => {
61
- for (const ref of liveRunners) {
62
- const runner = ref.deref();
63
- if (runner === void 0) {
64
- liveRunners.delete(ref);
65
- continue;
66
- }
67
- runner.invalidateArtifactCache();
68
- }
63
+ artifactCacheGeneration++;
69
64
  };
70
65
  var DecisionMachineRunner = class DecisionMachineRunner {
71
66
  constructor(db) {
72
67
  this.db = db;
73
68
  this.artifactCache = /* @__PURE__ */ new Map();
74
- liveRunners.add(new WeakRef(this));
69
+ this.seenArtifactCacheGeneration = artifactCacheGeneration;
75
70
  }
76
71
  /** Drop every entry in this runner's artifact cache. */
77
72
  invalidateArtifactCache() {
78
73
  this.artifactCache.clear();
79
74
  }
75
+ /** Drop the cache if an invalidation happened since it was last consulted. */
76
+ dropArtifactCacheIfStale() {
77
+ if (this.seenArtifactCacheGeneration !== artifactCacheGeneration) {
78
+ this.seenArtifactCacheGeneration = artifactCacheGeneration;
79
+ this.artifactCache.clear();
80
+ }
81
+ }
80
82
  /** Build a cache key for a given scope + kind + dappAccount tuple. */
81
83
  static cacheKey(scope, kind, dappAccount) {
82
84
  return `${scope}:${kind}:${dappAccount ?? ""}`;
83
85
  }
84
86
  /** Return a cached artifact if still fresh, or undefined. */
85
87
  getCachedArtifact(scope, kind, dappAccount) {
88
+ this.dropArtifactCacheIfStale();
86
89
  const entry = this.artifactCache.get(DecisionMachineRunner.cacheKey(scope, kind, dappAccount));
87
90
  if (!entry) return null;
88
91
  if (Date.now() - entry.cachedAt > ARTIFACT_CACHE_TTL_MS) {
@@ -7,8 +7,8 @@ let node_path = require("node:path");
7
7
  * Loads a pool of precomputed, obfuscated detector bundles from disk and caches
8
8
  * them in memory — the Node analogue of the Rust "bumblebee" `bundle_manager`.
9
9
  * Each bundle is a `{id}.js` (served to the browser) paired with a `{id}.json`
10
- * (`{ privateKey, innerConfig }`, kept server-side) produced by the catcher
11
- * `bundle:pool` build script.
10
+ * (`{ privateKey, innerConfig, payloadLayout }`, kept server-side) produced by
11
+ * the catcher `bundle:pool` build script.
12
12
  *
13
13
  * A bundle is assigned per detector session by {@link DetectorBundlePool.at},
14
14
  * served by id, and resolved again at decryption time so the provider uses the
@@ -67,11 +67,13 @@ var DetectorBundlePool = class {
67
67
  continue;
68
68
  }
69
69
  if (expectedRelease && !release) unstamped++;
70
+ const payloadLayout = typeof secrets.payloadLayout === "string" ? secrets.payloadLayout : void 0;
70
71
  next.set(bundleId, {
71
72
  js,
72
73
  privateKey: secrets.privateKey,
73
74
  innerConfig: secrets.innerConfig,
74
- ...release && { release }
75
+ ...release && { release },
76
+ ...payloadLayout && { payloadLayout }
75
77
  });
76
78
  } catch (error) {
77
79
  logger.warn?.("failed to load bundle pool entry", {
@@ -167,7 +169,8 @@ function persistDetectorBundlePool(bundles, dir = globalPoolDir) {
167
169
  (0, node_fs.writeFileSync)(jsonTmp, JSON.stringify({
168
170
  privateKey: bundle.privateKey,
169
171
  innerConfig: bundle.innerConfig,
170
- ...bundle.release && { release: bundle.release }
172
+ ...bundle.release && { release: bundle.release },
173
+ ...bundle.payloadLayout && { payloadLayout: bundle.payloadLayout }
171
174
  }), {
172
175
  encoding: "utf8",
173
176
  mode: 384