@prosopo/provider 5.13.4 → 5.15.0

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 (205) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +30 -30
  2. package/.turbo/turbo-build$colon$tsc.log +27 -30
  3. package/.turbo/turbo-build.log +30 -33
  4. package/CHANGELOG.md +233 -0
  5. package/LICENSE +201 -0
  6. package/dist/api/adminAuthOptions.d.ts +4 -0
  7. package/dist/api/adminAuthOptions.d.ts.map +1 -0
  8. package/dist/api/adminAuthOptions.js +34 -0
  9. package/dist/api/adminAuthOptions.js.map +1 -0
  10. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts +2 -1
  11. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.d.ts.map +1 -1
  12. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js +11 -2
  13. package/dist/api/captcha/getFrictionlessCaptchaChallenge/constants.js.map +1 -1
  14. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.d.ts.map +1 -1
  15. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js +16 -11
  16. package/dist/api/captcha/getFrictionlessCaptchaChallenge/handler.js.map +1 -1
  17. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts +5 -0
  18. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.d.ts.map +1 -0
  19. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js +20 -0
  20. package/dist/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.js.map +1 -0
  21. package/dist/api/captcha/getPuzzleCaptchaChallenge.d.ts.map +1 -1
  22. package/dist/api/captcha/getPuzzleCaptchaChallenge.js +24 -0
  23. package/dist/api/captcha/getPuzzleCaptchaChallenge.js.map +1 -1
  24. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts +4 -11
  25. package/dist/api/captcha/submitPoWCaptchaSolution.d.ts.map +1 -1
  26. package/dist/api/captcha/submitPoWCaptchaSolution.js +12 -17
  27. package/dist/api/captcha/submitPoWCaptchaSolution.js.map +1 -1
  28. package/dist/api/detectorPoolBodyParser.d.ts +4 -0
  29. package/dist/api/detectorPoolBodyParser.d.ts.map +1 -0
  30. package/dist/api/detectorPoolBodyParser.js +31 -0
  31. package/dist/api/detectorPoolBodyParser.js.map +1 -0
  32. package/dist/api/domainMiddleware.d.ts.map +1 -1
  33. package/dist/api/domainMiddleware.js +5 -1
  34. package/dist/api/domainMiddleware.js.map +1 -1
  35. package/dist/api/metrics.d.ts +2 -1
  36. package/dist/api/metrics.d.ts.map +1 -1
  37. package/dist/api/metrics.js +46 -4
  38. package/dist/api/metrics.js.map +1 -1
  39. package/dist/api/rawTlsSignalsMiddleware.d.ts +14 -1
  40. package/dist/api/rawTlsSignalsMiddleware.d.ts.map +1 -1
  41. package/dist/api/rawTlsSignalsMiddleware.js +111 -23
  42. package/dist/api/rawTlsSignalsMiddleware.js.map +1 -1
  43. package/dist/api/startProviderApi.d.ts.map +1 -1
  44. package/dist/api/startProviderApi.js +8 -5
  45. package/dist/api/startProviderApi.js.map +1 -1
  46. package/dist/api/verify.d.ts.map +1 -1
  47. package/dist/api/verify.js +50 -8
  48. package/dist/api/verify.js.map +1 -1
  49. package/dist/cjs/api/adminAuthOptions.cjs +35 -0
  50. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/constants.cjs +10 -0
  51. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/handler.cjs +14 -8
  52. package/dist/cjs/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.cjs +20 -0
  53. package/dist/cjs/api/captcha/getPuzzleCaptchaChallenge.cjs +24 -0
  54. package/dist/cjs/api/captcha/submitPoWCaptchaSolution.cjs +10 -15
  55. package/dist/cjs/api/detectorPoolBodyParser.cjs +33 -0
  56. package/dist/cjs/api/domainMiddleware.cjs +5 -1
  57. package/dist/cjs/api/metrics.cjs +46 -3
  58. package/dist/cjs/api/rawTlsSignalsMiddleware.cjs +111 -22
  59. package/dist/cjs/api/startProviderApi.cjs +8 -5
  60. package/dist/cjs/api/verify.cjs +50 -8
  61. package/dist/cjs/compositeIpAddress.cjs +21 -7
  62. package/dist/cjs/tasks/captchaManager.cjs +15 -0
  63. package/dist/cjs/tasks/captchaTypeSelection.cjs +23 -2
  64. package/dist/cjs/tasks/client/clientTasks.cjs +25 -4
  65. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +1 -1
  66. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +26 -23
  67. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +4 -11
  68. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +7 -11
  69. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +2 -0
  70. package/dist/cjs/tasks/puzzle/backgroundBuffer.cjs +3 -3
  71. package/dist/cjs/tasks/puzzle/nativeBackground.cjs +12 -5
  72. package/dist/cjs/tasks/puzzle/puzzleRenderer.cjs +4 -3
  73. package/dist/cjs/tasks/puzzleCaptcha/puzzleTasks.cjs +2 -9
  74. package/dist/cjs/utils/tarpitPadding.cjs +81 -10
  75. package/dist/compositeIpAddress.d.ts.map +1 -1
  76. package/dist/compositeIpAddress.js +21 -7
  77. package/dist/compositeIpAddress.js.map +1 -1
  78. package/dist/tasks/captchaManager.d.ts.map +1 -1
  79. package/dist/tasks/captchaManager.js +16 -1
  80. package/dist/tasks/captchaManager.js.map +1 -1
  81. package/dist/tasks/captchaTypeSelection.d.ts +3 -1
  82. package/dist/tasks/captchaTypeSelection.d.ts.map +1 -1
  83. package/dist/tasks/captchaTypeSelection.js +23 -3
  84. package/dist/tasks/captchaTypeSelection.js.map +1 -1
  85. package/dist/tasks/client/clientTasks.d.ts +1 -0
  86. package/dist/tasks/client/clientTasks.d.ts.map +1 -1
  87. package/dist/tasks/client/clientTasks.js +25 -5
  88. package/dist/tasks/client/clientTasks.js.map +1 -1
  89. package/dist/tasks/dataset/datasetTasksUtils.js +1 -1
  90. package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -1
  91. package/dist/tasks/frictionless/frictionlessTasks.d.ts +3 -1
  92. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  93. package/dist/tasks/frictionless/frictionlessTasks.js +28 -25
  94. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  95. package/dist/tasks/frictionless/routingMachine.d.ts +1 -2
  96. package/dist/tasks/frictionless/routingMachine.d.ts.map +1 -1
  97. package/dist/tasks/frictionless/routingMachine.js.map +1 -1
  98. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  99. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +4 -11
  100. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  101. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  102. package/dist/tasks/powCaptcha/powTasks.js +8 -12
  103. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  104. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +1 -0
  105. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
  106. package/dist/tasks/powCaptcha/powTasksUtils.js +2 -1
  107. package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
  108. package/dist/tasks/puzzle/backgroundBuffer.d.ts +3 -2
  109. package/dist/tasks/puzzle/backgroundBuffer.d.ts.map +1 -1
  110. package/dist/tasks/puzzle/backgroundBuffer.js +3 -3
  111. package/dist/tasks/puzzle/backgroundBuffer.js.map +1 -1
  112. package/dist/tasks/puzzle/nativeBackground.d.ts +5 -1
  113. package/dist/tasks/puzzle/nativeBackground.d.ts.map +1 -1
  114. package/dist/tasks/puzzle/nativeBackground.js +12 -5
  115. package/dist/tasks/puzzle/nativeBackground.js.map +1 -1
  116. package/dist/tasks/puzzle/puzzleRenderer.d.ts +2 -0
  117. package/dist/tasks/puzzle/puzzleRenderer.d.ts.map +1 -1
  118. package/dist/tasks/puzzle/puzzleRenderer.js +4 -3
  119. package/dist/tasks/puzzle/puzzleRenderer.js.map +1 -1
  120. package/dist/tasks/puzzleCaptcha/puzzleTasks.d.ts.map +1 -1
  121. package/dist/tasks/puzzleCaptcha/puzzleTasks.js +2 -9
  122. package/dist/tasks/puzzleCaptcha/puzzleTasks.js.map +1 -1
  123. package/dist/tests/integration/clientSettingsPersistence.integration.test.js +2 -0
  124. package/dist/tests/integration/clientSettingsPersistence.integration.test.js.map +1 -1
  125. package/dist/tests/unit/api/adminAuthOptions.unit.test.d.ts +2 -0
  126. package/dist/tests/unit/api/adminAuthOptions.unit.test.d.ts.map +1 -0
  127. package/dist/tests/unit/api/adminAuthOptions.unit.test.js +38 -0
  128. package/dist/tests/unit/api/adminAuthOptions.unit.test.js.map +1 -0
  129. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js +35 -2
  130. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/constants.unit.test.js.map +1 -1
  131. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts +2 -0
  132. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.d.ts.map +1 -0
  133. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js +45 -0
  134. package/dist/tests/unit/api/captcha/getFrictionlessCaptchaChallenge/refreshLineage.unit.test.js.map +1 -0
  135. package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js +15 -1
  136. package/dist/tests/unit/api/captcha/submitPoWCaptchaSolution.escalation.unit.test.js.map +1 -1
  137. package/dist/tests/unit/api/detectorPoolBodyParser.unit.test.d.ts +2 -0
  138. package/dist/tests/unit/api/detectorPoolBodyParser.unit.test.d.ts.map +1 -0
  139. package/dist/tests/unit/api/detectorPoolBodyParser.unit.test.js +64 -0
  140. package/dist/tests/unit/api/detectorPoolBodyParser.unit.test.js.map +1 -0
  141. package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.d.ts +2 -0
  142. package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.d.ts.map +1 -0
  143. package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js +67 -0
  144. package/dist/tests/unit/api/domainMiddlewareErrorBody.unit.test.js.map +1 -0
  145. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js +174 -23
  146. package/dist/tests/unit/api/getFrictionlessCaptchaChallenge.unit.test.js.map +1 -1
  147. package/dist/tests/unit/api/metricsAccess.unit.test.d.ts +2 -0
  148. package/dist/tests/unit/api/metricsAccess.unit.test.d.ts.map +1 -0
  149. package/dist/tests/unit/api/metricsAccess.unit.test.js +87 -0
  150. package/dist/tests/unit/api/metricsAccess.unit.test.js.map +1 -0
  151. package/dist/tests/unit/api/public.unit.test.js +4 -1
  152. package/dist/tests/unit/api/public.unit.test.js.map +1 -1
  153. package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js +96 -1
  154. package/dist/tests/unit/api/rawTlsSignalsMiddleware.unit.test.js.map +1 -1
  155. package/dist/tests/unit/api/validateAddress.unit.test.js +1 -1
  156. package/dist/tests/unit/api/validateAddress.unit.test.js.map +1 -1
  157. package/dist/tests/unit/api/verifyBadDappSignature.unit.test.d.ts +2 -0
  158. package/dist/tests/unit/api/verifyBadDappSignature.unit.test.d.ts.map +1 -0
  159. package/dist/tests/unit/api/verifyBadDappSignature.unit.test.js +96 -0
  160. package/dist/tests/unit/api/verifyBadDappSignature.unit.test.js.map +1 -0
  161. package/dist/tests/unit/api/verifyMalformedToken.unit.test.d.ts +2 -0
  162. package/dist/tests/unit/api/verifyMalformedToken.unit.test.d.ts.map +1 -0
  163. package/dist/tests/unit/api/verifyMalformedToken.unit.test.js +89 -0
  164. package/dist/tests/unit/api/verifyMalformedToken.unit.test.js.map +1 -0
  165. package/dist/tests/unit/compositeIpAddress.unit.test.js +12 -3
  166. package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -1
  167. package/dist/tests/unit/tasks/captchaManager.unit.test.js +51 -0
  168. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  169. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js +20 -1
  170. package/dist/tests/unit/tasks/captchaTypeSelection.unit.test.js.map +1 -1
  171. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +33 -1
  172. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  173. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +14 -1
  174. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -1
  175. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts +2 -0
  176. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.d.ts.map +1 -0
  177. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js +94 -0
  178. package/dist/tests/unit/tasks/frictionless/allowedCaptchaTypes.unit.test.js.map +1 -0
  179. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts +2 -0
  180. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.d.ts.map +1 -0
  181. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js +103 -0
  182. package/dist/tests/unit/tasks/frictionless/refreshSwitch.unit.test.js.map +1 -0
  183. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +23 -1
  184. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
  185. package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js +1 -4
  186. package/dist/tests/unit/tasks/puzzle/backgroundBuffer.unit.test.js.map +1 -1
  187. package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js +10 -3
  188. package/dist/tests/unit/tasks/puzzle/nativeBackground.unit.test.js.map +1 -1
  189. package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts +2 -0
  190. package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.d.ts.map +1 -0
  191. package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js +35 -0
  192. package/dist/tests/unit/tasks/puzzle/puzzleRenderer.unit.test.js.map +1 -0
  193. package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts +2 -0
  194. package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.d.ts.map +1 -0
  195. package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js +49 -0
  196. package/dist/tests/unit/tasks/puzzleDifficultyDeviceCap.unit.test.js.map +1 -0
  197. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts +17 -14
  198. package/dist/tests/unit/testUtils/mockProviderEnv.d.ts.map +1 -1
  199. package/dist/tests/unit/testUtils/mockProviderEnv.js.map +1 -1
  200. package/dist/tests/unit/utils/tarpitPadding.unit.test.js +118 -36
  201. package/dist/tests/unit/utils/tarpitPadding.unit.test.js.map +1 -1
  202. package/dist/utils/tarpitPadding.d.ts.map +1 -1
  203. package/dist/utils/tarpitPadding.js +81 -10
  204. package/dist/utils/tarpitPadding.js.map +1 -1
  205. package/package.json +105 -103
@@ -1,39 +1,62 @@
1
+ import { EventEmitter } from "node:events";
1
2
  import { MAX_PAD_BYTES } from "@prosopo/types";
2
3
  import { describe, expect, it, vi } from "vitest";
3
4
  import { padResponseMiddleware } from "../../../utils/tarpitPadding.js";
4
- const makeRes = (padBytes) => {
5
+ const makeRes = ({ padBytes, highWaterMark }) => {
5
6
  const chunks = [];
6
7
  const headers = {};
8
+ const emitter = new EventEmitter();
9
+ let written = 0;
7
10
  let ended = false;
11
+ let destroyed = false;
8
12
  const jsonMock = vi.fn();
9
- const res = {
13
+ const res = Object.assign(emitter, {
10
14
  locals: { padBytes },
11
15
  json: jsonMock,
16
+ get writableEnded() {
17
+ return ended;
18
+ },
19
+ get destroyed() {
20
+ return destroyed;
21
+ },
12
22
  setHeader: (name, value) => {
13
23
  headers[name.toLowerCase()] = value;
14
24
  },
15
25
  write: (chunk) => {
16
26
  chunks.push(chunk);
17
- return true;
27
+ written += chunk.length;
28
+ return highWaterMark === undefined || written < highWaterMark;
18
29
  },
19
30
  end: () => {
20
31
  ended = true;
21
32
  return res;
22
33
  },
23
- };
34
+ destroy: () => {
35
+ destroyed = true;
36
+ },
37
+ });
24
38
  return {
25
39
  res,
40
+ emitter,
26
41
  body: () => chunks.join(""),
42
+ written: () => written,
27
43
  jsonMock,
28
44
  headers,
29
45
  ended: () => ended,
46
+ destroyed: () => destroyed,
47
+ close: () => {
48
+ destroyed = true;
49
+ emitter.emit("close");
50
+ },
30
51
  };
31
52
  };
32
- const send = (fake, body) => {
53
+ const flush = () => new Promise((resolve) => setImmediate(resolve));
54
+ const send = async (fake, body) => {
33
55
  const next = vi.fn();
34
56
  padResponseMiddleware({}, fake.res, next);
35
57
  expect(next).toHaveBeenCalled();
36
58
  fake.res.json(body);
59
+ await flush();
37
60
  };
38
61
  const CHALLENGE = {
39
62
  status: "ok",
@@ -41,59 +64,118 @@ const CHALLENGE = {
41
64
  difficulty: 9,
42
65
  timestamp: "1764000000000",
43
66
  };
67
+ const padOf = (parsed) => Object.entries(parsed)
68
+ .filter(([key]) => !(key in CHALLENGE))
69
+ .map(([, value]) => String(value));
44
70
  describe("padResponseMiddleware", () => {
45
- it("leaves the response untouched when no padding was resolved", () => {
46
- const fake = makeRes(undefined);
47
- send(fake, CHALLENGE);
71
+ it("leaves the response untouched when no padding was resolved", async () => {
72
+ const fake = makeRes({ padBytes: undefined });
73
+ await send(fake, CHALLENGE);
48
74
  expect(fake.jsonMock).toHaveBeenCalledWith(CHALLENGE);
49
75
  expect(fake.body()).toBe("");
50
76
  });
51
- it("leaves the response untouched for a zero or negative padBytes", () => {
77
+ it("leaves the response untouched for a zero or negative padBytes", async () => {
52
78
  for (const padBytes of [0, -1]) {
53
- const fake = makeRes(padBytes);
54
- send(fake, CHALLENGE);
79
+ const fake = makeRes({ padBytes });
80
+ await send(fake, CHALLENGE);
55
81
  expect(fake.jsonMock).toHaveBeenCalledWith(CHALLENGE);
56
82
  expect(fake.body()).toBe("");
57
83
  }
58
84
  });
59
- it("appends the requested padding and keeps every real field", () => {
60
- const fake = makeRes(4096);
61
- send(fake, CHALLENGE);
85
+ it("emits the requested total padding and keeps every real field", async () => {
86
+ const fake = makeRes({ padBytes: 4096 });
87
+ await send(fake, CHALLENGE);
62
88
  expect(fake.jsonMock).not.toHaveBeenCalled();
63
89
  const parsed = JSON.parse(fake.body());
64
- expect(parsed.pad).toHaveLength(4096);
65
90
  expect(parsed).toMatchObject(CHALLENGE);
91
+ expect(padOf(parsed).join("")).toHaveLength(4096);
66
92
  expect(fake.headers["content-type"]).toBe("application/json; charset=utf-8");
67
93
  expect(fake.ended()).toBe(true);
68
94
  });
69
- it("writes the padding before any real field, so a scraper cannot read a prefix and abort", () => {
70
- const fake = makeRes(2048);
71
- send(fake, CHALLENGE);
95
+ it("interleaves the padding so no real field arrives before some of it", async () => {
96
+ const fake = makeRes({ padBytes: 4096 });
97
+ await send(fake, CHALLENGE);
72
98
  const body = fake.body();
73
- expect(body.indexOf('"pad"')).toBe(1);
74
- expect(body.indexOf('"challenge"')).toBeGreaterThan(2048);
99
+ const parsed = JSON.parse(fake.body());
100
+ const pads = padOf(parsed);
101
+ expect(pads).toHaveLength(Object.keys(CHALLENGE).length);
102
+ for (const field of Object.keys(CHALLENGE)) {
103
+ expect(body.indexOf(`"${field}"`)).toBeGreaterThan(0);
104
+ }
105
+ const lastPad = pads[pads.length - 1] ?? "";
106
+ expect(body.indexOf('"timestamp"')).toBeGreaterThan(4096 - lastPad.length);
75
107
  });
76
- it("pads with incompressible bytes", () => {
77
- const fake = makeRes(8192);
78
- send(fake, CHALLENGE);
79
- const pad = JSON.parse(fake.body()).pad;
80
- expect(new Set(pad).size).toBeGreaterThan(50);
108
+ it("uses unpredictable pad keys rather than a fixed marker", async () => {
109
+ const keysFor = async () => {
110
+ const fake = makeRes({ padBytes: 512 });
111
+ await send(fake, CHALLENGE);
112
+ const parsed = JSON.parse(fake.body());
113
+ return Object.keys(parsed).filter((key) => !(key in CHALLENGE));
114
+ };
115
+ const first = await keysFor();
116
+ const second = await keysFor();
117
+ expect(first).not.toContain("pad");
118
+ expect(first).not.toEqual(second);
81
119
  });
82
- it("clamps padding to the 5 MiB ceiling so it cannot be used as an amplifier", () => {
83
- const fake = makeRes(MAX_PAD_BYTES * 10);
84
- send(fake, CHALLENGE);
85
- expect(JSON.parse(fake.body()).pad).toHaveLength(MAX_PAD_BYTES);
120
+ it("pads with incompressible bytes", async () => {
121
+ const fake = makeRes({ padBytes: 8192 });
122
+ await send(fake, CHALLENGE);
123
+ const parsed = JSON.parse(fake.body());
124
+ expect(new Set(padOf(parsed).join("")).size).toBeGreaterThan(50);
125
+ });
126
+ it("clamps padding to the 5 MiB ceiling so it cannot be used as an amplifier", async () => {
127
+ const fake = makeRes({ padBytes: MAX_PAD_BYTES * 10 });
128
+ await send(fake, CHALLENGE);
129
+ const parsed = JSON.parse(fake.body());
130
+ expect(padOf(parsed).join("")).toHaveLength(MAX_PAD_BYTES);
86
131
  });
87
- it("emits valid JSON for a body with no fields", () => {
88
- const fake = makeRes(64);
89
- send(fake, {});
90
- expect(JSON.parse(fake.body()).pad).toHaveLength(64);
132
+ it("emits valid JSON for a body with no fields", async () => {
133
+ const fake = makeRes({ padBytes: 64 });
134
+ await send(fake, {});
135
+ const parsed = JSON.parse(fake.body());
136
+ expect(padOf(parsed).join("")).toHaveLength(64);
91
137
  });
92
- it("does not pad a non-object body, which has no fields to splice into", () => {
93
- const fake = makeRes(64);
94
- send(fake, ["a", "b"]);
138
+ it("does not pad a non-object body, which has no fields to splice into", async () => {
139
+ const fake = makeRes({ padBytes: 64 });
140
+ await send(fake, ["a", "b"]);
95
141
  expect(fake.jsonMock).toHaveBeenCalledWith(["a", "b"]);
96
142
  expect(fake.body()).toBe("");
97
143
  });
144
+ it("stops writing once the socket reports backpressure and resumes on drain", async () => {
145
+ const fake = makeRes({ padBytes: 512 * 1024, highWaterMark: 64 * 1024 });
146
+ await send(fake, CHALLENGE);
147
+ const paused = fake.written();
148
+ expect(paused).toBeLessThan(128 * 1024);
149
+ expect(fake.ended()).toBe(false);
150
+ fake.emitter.emit("drain");
151
+ await flush();
152
+ expect(fake.written()).toBeGreaterThan(paused);
153
+ });
154
+ it("abandons the pad when the peer stops reading, instead of buffering it", async () => {
155
+ const fake = makeRes({
156
+ padBytes: MAX_PAD_BYTES,
157
+ highWaterMark: 64 * 1024,
158
+ });
159
+ await send(fake, CHALLENGE);
160
+ const paused = fake.written();
161
+ fake.close();
162
+ await flush();
163
+ expect(fake.written()).toBe(paused);
164
+ expect(fake.written()).toBeLessThan(128 * 1024);
165
+ expect(fake.ended()).toBe(false);
166
+ });
167
+ it("does not resume writing after a drain that follows a close", async () => {
168
+ const fake = makeRes({
169
+ padBytes: MAX_PAD_BYTES,
170
+ highWaterMark: 64 * 1024,
171
+ });
172
+ await send(fake, CHALLENGE);
173
+ fake.close();
174
+ await flush();
175
+ const paused = fake.written();
176
+ fake.emitter.emit("drain");
177
+ await flush();
178
+ expect(fake.written()).toBe(paused);
179
+ });
98
180
  });
99
181
  //# sourceMappingURL=tarpitPadding.unit.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tarpitPadding.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/utils/tarpitPadding.unit.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tarpitPadding.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/utils/tarpitPadding.unit.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tarpitPadding.d.ts","sourceRoot":"","sources":["../../src/utils/tarpitPadding.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAuB/D,eAAO,MAAM,qBAAqB,SAC3B,OAAO,OACR,QAAQ,QACP,YAAY,KAChB,IAYF,CAAC"}
1
+ {"version":3,"file":"tarpitPadding.d.ts","sourceRoot":"","sources":["../../src/utils/tarpitPadding.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAgH/D,eAAO,MAAM,qBAAqB,SAC3B,OAAO,OACR,QAAQ,QACP,YAAY,KAChB,IAkBF,CAAC"}
@@ -2,22 +2,93 @@ import { MAX_PAD_BYTES } from "@prosopo/types";
2
2
  import { randomBytes } from "node:crypto";
3
3
  //#region src/utils/tarpitPadding.ts
4
4
  var POOL = randomBytes(Math.ceil(MAX_PAD_BYTES * 3 / 4)).toString("base64");
5
+ var CHUNK_BYTES = 64 * 1024;
6
+ var KEY_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
7
+ var MIN_KEY_LENGTH = 3;
8
+ var MAX_KEY_LENGTH = 12;
5
9
  var clampPadBytes = (padBytes) => padBytes && padBytes > 0 ? Math.min(Math.floor(padBytes), MAX_PAD_BYTES) : 0;
6
- var streamWithPad = (res, body, n) => {
7
- const offset = Math.floor(Math.random() * (POOL.length - n + 1));
8
- const fields = JSON.stringify(body).slice(1, -1);
10
+ var isPlainObject = (body) => typeof body === "object" && body !== null && !Array.isArray(body);
11
+ var bodyMembers = (body) => {
12
+ const serialised = JSON.stringify(body);
13
+ if (serialised === void 0 || !serialised.startsWith("{")) return void 0;
14
+ const normalised = JSON.parse(serialised);
15
+ return Object.entries(normalised).map(([key, value]) => ({
16
+ key,
17
+ encoded: `${JSON.stringify(key)}:${JSON.stringify(value)}`
18
+ }));
19
+ };
20
+ var randomKey = (taken) => {
21
+ for (;;) {
22
+ const length = MIN_KEY_LENGTH + Math.floor(Math.random() * (MAX_KEY_LENGTH - MIN_KEY_LENGTH + 1));
23
+ let key = "";
24
+ for (let index = 0; index < length; index++) key += KEY_ALPHABET.charAt(Math.floor(Math.random() * KEY_ALPHABET.length));
25
+ if (!taken.has(key)) {
26
+ taken.add(key);
27
+ return key;
28
+ }
29
+ }
30
+ };
31
+ var partition = (total, parts) => {
32
+ const cuts = [0, total];
33
+ for (let index = 1; index < parts; index++) cuts.push(Math.floor(Math.random() * (total + 1)));
34
+ cuts.sort((a, b) => a - b);
35
+ const sizes = [];
36
+ for (let index = 1; index < cuts.length; index++) sizes.push((cuts[index] ?? 0) - (cuts[index - 1] ?? 0));
37
+ return sizes;
38
+ };
39
+ var awaitDrain = (res) => new Promise((resolve) => {
40
+ const settle = (drained) => {
41
+ res.removeListener("drain", onDrain);
42
+ res.removeListener("close", onClose);
43
+ resolve(drained);
44
+ };
45
+ const onDrain = () => settle(true);
46
+ const onClose = () => settle(false);
47
+ res.once("drain", onDrain);
48
+ res.once("close", onClose);
49
+ });
50
+ var write = async (res, chunk) => {
51
+ if (res.writableEnded || res.destroyed) return false;
52
+ return res.write(chunk) ? true : await awaitDrain(res);
53
+ };
54
+ var writePad = async (res, size) => {
55
+ const offset = Math.floor(Math.random() * (POOL.length - size + 1));
56
+ for (let written = 0; written < size; written += CHUNK_BYTES) {
57
+ const from = offset + written;
58
+ const to = offset + Math.min(written + CHUNK_BYTES, size);
59
+ if (!await write(res, POOL.slice(from, to))) return false;
60
+ }
61
+ return true;
62
+ };
63
+ var streamWithPad = async (res, members, total) => {
64
+ const segments = Math.max(members.length, 1);
65
+ const sizes = partition(total, segments);
66
+ const taken = new Set(members.map((member) => member.key));
9
67
  res.setHeader("content-type", "application/json; charset=utf-8");
10
- res.write("{\"pad\":\"");
11
- res.write(POOL.slice(offset, offset + n));
12
- res.write(fields ? `",${fields}}` : "\"}");
13
- return res.end();
68
+ let separator = "{";
69
+ for (let index = 0; index < segments; index++) {
70
+ if (!await write(res, `${separator}"${randomKey(taken)}":"`)) return;
71
+ if (!await writePad(res, sizes[index] ?? 0)) return;
72
+ const member = members[index];
73
+ if (!await write(res, member ? `",${member.encoded}` : "\"")) return;
74
+ separator = ",";
75
+ }
76
+ if (!await write(res, "}")) return;
77
+ res.end();
14
78
  };
15
- var isPlainObject = (body) => typeof body === "object" && body !== null && !Array.isArray(body);
16
79
  var padResponseMiddleware = (_req, res, next) => {
17
80
  const originalJson = res.json.bind(res);
18
81
  res.json = (body) => {
19
- const n = clampPadBytes(res.locals.padBytes);
20
- return n === 0 || !isPlainObject(body) ? originalJson(body) : streamWithPad(res, body, n);
82
+ const total = clampPadBytes(res.locals.padBytes);
83
+ if (total === 0 || !isPlainObject(body)) return originalJson(body);
84
+ const members = bodyMembers(body);
85
+ if (members === void 0) return originalJson(body);
86
+ const swallow = () => void 0;
87
+ res.on("error", swallow);
88
+ streamWithPad(res, members, total).catch(() => {
89
+ if (!res.destroyed) res.destroy();
90
+ }).finally(() => res.removeListener("error", swallow));
91
+ return res;
21
92
  };
22
93
  next();
23
94
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tarpitPadding.js","sourceRoot":"","sources":["../../src/utils/tarpitPadding.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAEhF,MAAM,aAAa,GAAG,CAAC,QAA4B,EAAU,EAAE,CAC9D,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9E,MAAM,aAAa,GAAG,CAAC,GAAa,EAAE,IAAY,EAAE,CAAS,EAAY,EAAE;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAIjE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;IACjE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACtB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1C,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAa,EAAkB,EAAE,CACvD,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACpC,IAAa,EACb,GAAa,EACb,IAAkB,EACX,EAAE;IACT,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAY,EAAY,EAAE;QACrC,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAI7C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YACpB,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC;IACF,IAAI,EAAE,CAAC;AACR,CAAC,CAAC"}
1
+ {"version":3,"file":"tarpitPadding.js","sourceRoot":"","sources":["../../src/utils/tarpitPadding.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAEhF,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9B,MAAM,YAAY,GACjB,gEAAgE,CAAC;AAElE,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,cAAc,GAAG,EAAE,CAAC;AAI1B,MAAM,aAAa,GAAG,CAAC,QAA4B,EAAU,EAAE,CAC9D,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9E,MAAM,aAAa,GAAG,CAAC,IAAa,EAAkB,EAAE,CACvD,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnE,MAAM,WAAW,GAAG,CAAC,IAAY,EAA4B,EAAE;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9E,MAAM,UAAU,GAA4B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,GAAG;QACH,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;KAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAAkB,EAAU,EAAE;IAChD,SAAS,CAAC;QACT,MAAM,MAAM,GACX,cAAc;YACd,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7C,GAAG,IAAI,YAAY,CAAC,MAAM,CACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAC/C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,OAAO,GAAG,CAAC;QACZ,CAAC;IACF,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa,EAAY,EAAE;IAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,GAAa,EAAoB,EAAE,CACtD,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;IAChC,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAQ,EAAE;QACzC,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEJ,MAAM,KAAK,GAAG,KAAK,EAAE,GAAa,EAAE,KAAa,EAAoB,EAAE;IACtE,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAa,EAAE,IAAY,EAAoB,EAAE;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,WAAW,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EAC1B,GAAa,EACb,OAAqB,EACrB,KAAa,EACG,EAAE;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3D,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;IAEjE,IAAI,SAAS,GAAG,GAAG,CAAC;IACpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO;QACvE,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO;QACtD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO;QACtE,SAAS,GAAG,GAAG,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAE,OAAO;IACrC,GAAG,CAAC,GAAG,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACpC,IAAa,EACb,GAAa,EACb,IAAkB,EACX,EAAE;IACT,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAY,EAAY,EAAE;QACrC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,SAAS,CAAC;QACtC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzB,KAAK,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC;aACrC,KAAK,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,SAAS;gBAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC;IACZ,CAAC,CAAC;IACF,IAAI,EAAE,CAAC;AACR,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,104 +1,106 @@
1
1
  {
2
- "name": "@prosopo/provider",
3
- "version": "5.13.4",
4
- "author": "PROSOPO LIMITED <info@prosopo.io>",
5
- "license": "Apache-2.0",
6
- "type": "module",
7
- "engines": {
8
- "node": "^24",
9
- "npm": "^11"
10
- },
11
- "scripts": {
12
- "clean": "del-cli --verbose dist tsconfig.tsbuildinfo",
13
- "build": "npm run build:cross-env -- --mode ${NODE_ENV:-development}",
14
- "build:cross-env": "vite build --config vite.esm.config.ts",
15
- "build:tsc": "tsc --build --verbose",
16
- "build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
17
- "build:edge": "node ./scripts/buildEdgeScript.mjs",
18
- "typecheck": "tsc --project tsconfig.types.json",
19
- "test:unit": "NODE_ENV=${NODE_ENV:-test}; TEST_TYPE=unit npx vitest run --config ./vite.test.config.ts",
20
- "test:integration": "NODE_ENV=${NODE_ENV:-test}; TEST_TYPE=integration DECISION_MACHINE_ARTIFACT_CACHE_TTL_MS=1 npx vitest run --config ./vite.threads.test.config.ts",
21
- "test": "npm run test:unit && npm run test:integration",
22
- "mnemonic": "tsx ./scripts/generateMnemonic.ts"
23
- },
24
- "dependencies": {
25
- "@noble/hashes": "2.4.0",
26
- "@polkadot/util": "14.0.3",
27
- "@prosopo/api": "4.3.7",
28
- "@prosopo/api-express-router": "3.1.98",
29
- "@prosopo/api-route": "2.6.61",
30
- "@prosopo/captcha-severity": "1.1.2",
31
- "@prosopo/common": "3.1.60",
32
- "@prosopo/database": "4.1.2",
33
- "@prosopo/datasets": "3.1.93",
34
- "@prosopo/env": "3.6.67",
35
- "@prosopo/ipinfo": "0.4.12",
36
- "@prosopo/keyring": "2.9.99",
37
- "@prosopo/load-balancer": "2.11.3",
38
- "@prosopo/locale": "3.6.1",
39
- "@prosopo/logger": "2.1.1",
40
- "@prosopo/native-ja4": "0.0.7",
41
- "@prosopo/native-merkle": "0.0.6",
42
- "@prosopo/native-puzzle": "0.1.0",
43
- "@prosopo/puzzle-assets": "0.1.4",
44
- "@prosopo/redis-client": "1.0.38",
45
- "@prosopo/types": "5.11.1",
46
- "@prosopo/types-database": "5.7.2",
47
- "@prosopo/types-env": "2.11.13",
48
- "@prosopo/user-access-policy": "3.14.13",
49
- "@prosopo/util": "3.3.12",
50
- "@prosopo/util-crypto": "13.5.33",
51
- "@prosopo/web-bot-auth": "0.1.3",
52
- "cron": "3.1.7",
53
- "express": "4.22.2",
54
- "express-rate-limit": "7.4.0",
55
- "geolib": "3.3.14",
56
- "i18next": "26.4.2",
57
- "ip-address": "10.7.0",
58
- "mongoose": "9.10.0",
59
- "prom-client": "15.1.3",
60
- "uuid": "14.0.2",
61
- "zod": "3.23.8"
62
- },
63
- "devDependencies": {
64
- "@noble/curves": "2.4.0",
65
- "@prosopo/config": "3.4.2",
66
- "@types/node": "22.5.5",
67
- "@types/pg": "8.23.1",
68
- "@types/uuid": "11.0.0",
69
- "@vitest/coverage-v8": "4.1.11",
70
- "concurrently": "9.0.1",
71
- "cors": "2.8.6",
72
- "del-cli": "6.0.0",
73
- "dotenv": "16.4.5",
74
- "esbuild": "0.28.2",
75
- "npm-run-all": "4.1.5",
76
- "testcontainers": "12.1.0",
77
- "tslib": "2.7.0",
78
- "tsx": "4.20.3",
79
- "typescript": "5.6.2",
80
- "undici": "6.29.0",
81
- "vite": "8.1.5",
82
- "vitest": "4.1.11"
83
- },
84
- "repository": {
85
- "type": "git",
86
- "url": "git+https://github.com/prosopo/captcha.git",
87
- "directory": "packages/provider"
88
- },
89
- "description": "The easiest way to deploy the Prosopo contract and run the Provider node is via the [captcha repository](https://github.com/prosopo/captcha/).",
90
- "bugs": {
91
- "url": "https://github.com/prosopo/captcha/issues"
92
- },
93
- "homepage": "https://github.com/prosopo/captcha#readme",
94
- "sideEffects": false,
95
- "main": "dist/index.js",
96
- "types": "dist/index.d.ts",
97
- "exports": {
98
- ".": {
99
- "types": "./dist/index.d.ts",
100
- "import": "./dist/index.js",
101
- "require": "./dist/cjs/index.cjs"
102
- }
103
- }
104
- }
2
+ "name": "@prosopo/provider",
3
+ "version": "5.15.0",
4
+ "author": "PROSOPO LIMITED <info@prosopo.io>",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": "^24"
9
+ },
10
+ "dependencies": {
11
+ "@noble/hashes": "2.4.0",
12
+ "@polkadot/util": "14.0.3",
13
+ "@prosopo/api": "4.4.0",
14
+ "@prosopo/api-express-router": "3.2.1",
15
+ "@prosopo/api-route": "2.6.63",
16
+ "@prosopo/captcha-severity": "1.2.0",
17
+ "@prosopo/common": "3.1.62",
18
+ "@prosopo/database": "4.1.4",
19
+ "@prosopo/datasets": "3.2.1",
20
+ "@prosopo/env": "3.6.69",
21
+ "@prosopo/ipinfo": "0.4.14",
22
+ "@prosopo/keyring": "2.10.1",
23
+ "@prosopo/load-balancer": "2.11.5",
24
+ "@prosopo/locale": "3.7.0",
25
+ "@prosopo/logger": "2.1.3",
26
+ "@prosopo/native-ja4": "0.0.7",
27
+ "@prosopo/native-merkle": "0.0.6",
28
+ "@prosopo/native-puzzle": "0.1.0",
29
+ "@prosopo/puzzle-assets": "0.2.0",
30
+ "@prosopo/redis-client": "1.0.40",
31
+ "@prosopo/types": "5.13.0",
32
+ "@prosopo/types-database": "5.8.0",
33
+ "@prosopo/types-env": "2.11.15",
34
+ "@prosopo/user-access-policy": "3.14.15",
35
+ "@prosopo/util": "3.3.14",
36
+ "@prosopo/util-crypto": "13.6.0",
37
+ "@prosopo/web-bot-auth": "0.1.3",
38
+ "cron": "3.1.7",
39
+ "express": "4.22.2",
40
+ "express-rate-limit": "7.4.0",
41
+ "geolib": "3.3.14",
42
+ "i18next": "26.4.2",
43
+ "ip-address": "10.7.0",
44
+ "mongoose": "9.10.0",
45
+ "prom-client": "15.1.3",
46
+ "uuid": "14.0.2",
47
+ "zod": "3.23.8"
48
+ },
49
+ "devDependencies": {
50
+ "@noble/curves": "2.4.0",
51
+ "@prosopo/config": "3.4.3",
52
+ "@types/cors": "2.8.19",
53
+ "@types/express": "4.17.25",
54
+ "@types/node": "22.5.5",
55
+ "@types/pg": "8.23.1",
56
+ "@types/uuid": "11.0.0",
57
+ "@vitest/coverage-v8": "4.1.11",
58
+ "@vitest/spy": "4.1.11",
59
+ "concurrently": "9.0.1",
60
+ "cors": "2.8.6",
61
+ "del-cli": "6.0.0",
62
+ "dotenv": "16.4.5",
63
+ "esbuild": "0.28.2",
64
+ "npm-run-all": "4.1.5",
65
+ "testcontainers": "12.1.0",
66
+ "tslib": "2.7.0",
67
+ "tsx": "4.20.3",
68
+ "typescript": "5.6.2",
69
+ "undici": "6.29.0",
70
+ "vite": "8.1.5",
71
+ "vitest": "4.1.11"
72
+ },
73
+ "repository": {
74
+ "type": "git",
75
+ "url": "git+https://github.com/prosopo/captcha.git",
76
+ "directory": "packages/provider"
77
+ },
78
+ "description": "The easiest way to deploy the Prosopo contract and run the Provider node is via the [captcha repository](https://github.com/prosopo/captcha/).",
79
+ "bugs": {
80
+ "url": "https://github.com/prosopo/captcha/issues"
81
+ },
82
+ "homepage": "https://github.com/prosopo/captcha#readme",
83
+ "sideEffects": false,
84
+ "main": "dist/index.js",
85
+ "types": "dist/index.d.ts",
86
+ "exports": {
87
+ ".": {
88
+ "types": "./dist/index.d.ts",
89
+ "import": "./dist/index.js",
90
+ "require": "./dist/cjs/index.cjs"
91
+ }
92
+ },
93
+ "scripts": {
94
+ "clean": "del-cli --verbose dist tsconfig.tsbuildinfo",
95
+ "build": "pnpm run build:cross-env --mode ${NODE_ENV:-development}",
96
+ "build:cross-env": "vite build --config vite.esm.config.ts",
97
+ "build:tsc": "tsc --build --verbose",
98
+ "build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
99
+ "build:edge": "node ./scripts/buildEdgeScript.mjs",
100
+ "typecheck": "tsc --project tsconfig.types.json",
101
+ "test:unit": "NODE_ENV=${NODE_ENV:-test}; TEST_TYPE=unit pnpm exec vitest run --config ./vite.test.config.ts",
102
+ "test:integration": "NODE_ENV=${NODE_ENV:-test}; TEST_TYPE=integration DECISION_MACHINE_ARTIFACT_CACHE_TTL_MS=1 pnpm exec vitest run --config ./vite.threads.test.config.ts",
103
+ "test": "pnpm run test:unit && pnpm run test:integration",
104
+ "mnemonic": "tsx ./scripts/generateMnemonic.ts"
105
+ }
106
+ }