@prosopo/provider 2.9.7 → 3.0.5

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 (157) hide show
  1. package/CHANGELOG.md +186 -0
  2. package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -1
  3. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js +4 -4
  4. package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -1
  5. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -1
  6. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +5 -5
  7. package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -1
  8. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +1 -1
  9. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js +5 -5
  10. package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -1
  11. package/dist/api/blacklistRequestInspector.d.ts +6 -8
  12. package/dist/api/blacklistRequestInspector.d.ts.map +1 -1
  13. package/dist/api/blacklistRequestInspector.js +38 -20
  14. package/dist/api/blacklistRequestInspector.js.map +1 -1
  15. package/dist/api/block.d.ts.map +1 -1
  16. package/dist/api/block.js +5 -5
  17. package/dist/api/block.js.map +1 -1
  18. package/dist/api/captcha.d.ts.map +1 -1
  19. package/dist/api/captcha.js +114 -24
  20. package/dist/api/captcha.js.map +1 -1
  21. package/dist/api/domainMiddleware.d.ts.map +1 -1
  22. package/dist/api/domainMiddleware.js +3 -3
  23. package/dist/api/domainMiddleware.js.map +1 -1
  24. package/dist/api/headerCheckMiddleware.js +2 -2
  25. package/dist/api/headerCheckMiddleware.js.map +1 -1
  26. package/dist/api/ja4Middleware.d.ts.map +1 -1
  27. package/dist/api/ja4Middleware.js +18 -6
  28. package/dist/api/ja4Middleware.js.map +1 -1
  29. package/dist/api/public.d.ts +1 -2
  30. package/dist/api/public.d.ts.map +1 -1
  31. package/dist/api/public.js +9 -4
  32. package/dist/api/public.js.map +1 -1
  33. package/dist/api/validateAddress.d.ts +2 -2
  34. package/dist/api/validateAddress.d.ts.map +1 -1
  35. package/dist/api/validateAddress.js +10 -4
  36. package/dist/api/validateAddress.js.map +1 -1
  37. package/dist/api/verify.d.ts.map +1 -1
  38. package/dist/api/verify.js +8 -7
  39. package/dist/api/verify.js.map +1 -1
  40. package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +3 -3
  41. package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +4 -4
  42. package/dist/cjs/api/admin/apiUpdateDetectorKeyEndpoint.cjs +4 -4
  43. package/dist/cjs/api/blacklistRequestInspector.cjs +36 -21
  44. package/dist/cjs/api/block.cjs +4 -5
  45. package/dist/cjs/api/captcha.cjs +116 -39
  46. package/dist/cjs/api/domainMiddleware.cjs +3 -3
  47. package/dist/cjs/api/headerCheckMiddleware.cjs +1 -1
  48. package/dist/cjs/api/ja4Middleware.cjs +17 -8
  49. package/dist/cjs/api/public.cjs +9 -4
  50. package/dist/cjs/api/validateAddress.cjs +12 -6
  51. package/dist/cjs/api/verify.cjs +13 -12
  52. package/dist/cjs/index.cjs +1 -5
  53. package/dist/cjs/schedulers/captchaScheduler.cjs +11 -7
  54. package/dist/cjs/schedulers/getClientList.cjs +12 -5
  55. package/dist/cjs/tasks/captchaManager.cjs +76 -23
  56. package/dist/cjs/tasks/client/clientTasks.cjs +25 -19
  57. package/dist/cjs/tasks/detection/decodePayload.cjs +284 -362
  58. package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +32 -25
  59. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +37 -26
  60. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +19 -18
  61. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +5 -3
  62. package/dist/cjs/tasks/tasks.cjs +11 -2
  63. package/dist/cjs/util.cjs +58 -8
  64. package/dist/index.d.ts +0 -2
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +0 -2
  67. package/dist/index.js.map +1 -1
  68. package/dist/schedulers/captchaScheduler.d.ts +1 -1
  69. package/dist/schedulers/captchaScheduler.d.ts.map +1 -1
  70. package/dist/schedulers/captchaScheduler.js +11 -3
  71. package/dist/schedulers/captchaScheduler.js.map +1 -1
  72. package/dist/schedulers/getClientList.d.ts +1 -1
  73. package/dist/schedulers/getClientList.d.ts.map +1 -1
  74. package/dist/schedulers/getClientList.js +12 -3
  75. package/dist/schedulers/getClientList.js.map +1 -1
  76. package/dist/tasks/captchaManager.d.ts +14 -1
  77. package/dist/tasks/captchaManager.d.ts.map +1 -1
  78. package/dist/tasks/captchaManager.js +67 -24
  79. package/dist/tasks/captchaManager.js.map +1 -1
  80. package/dist/tasks/client/clientTasks.d.ts.map +1 -1
  81. package/dist/tasks/client/clientTasks.js +26 -18
  82. package/dist/tasks/client/clientTasks.js.map +1 -1
  83. package/dist/tasks/detection/decodePayload.d.ts +2 -2
  84. package/dist/tasks/detection/decodePayload.d.ts.map +1 -1
  85. package/dist/tasks/detection/decodePayload.js +184 -230
  86. package/dist/tasks/detection/decodePayload.js.map +1 -1
  87. package/dist/tasks/frictionless/frictionlessTasks.d.ts +4 -5
  88. package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -1
  89. package/dist/tasks/frictionless/frictionlessTasks.js +32 -24
  90. package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -1
  91. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +1 -1
  92. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -1
  93. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +38 -25
  94. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -1
  95. package/dist/tasks/powCaptcha/powTasks.d.ts +1 -1
  96. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -1
  97. package/dist/tasks/powCaptcha/powTasks.js +17 -18
  98. package/dist/tasks/powCaptcha/powTasks.js.map +1 -1
  99. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +1 -1
  100. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -1
  101. package/dist/tasks/powCaptcha/powTasksUtils.js +5 -3
  102. package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -1
  103. package/dist/tasks/tasks.d.ts +3 -2
  104. package/dist/tasks/tasks.d.ts.map +1 -1
  105. package/dist/tasks/tasks.js +13 -3
  106. package/dist/tasks/tasks.js.map +1 -1
  107. package/dist/tests/integration/imgCaptcha.integration.test.js +3 -2
  108. package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -1
  109. package/dist/tests/integration/powCaptcha.integration.test.js +9 -9
  110. package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -1
  111. package/dist/tests/integration/registerSitekey.d.ts.map +1 -1
  112. package/dist/tests/integration/registerSitekey.js +13 -2
  113. package/dist/tests/integration/registerSitekey.js.map +1 -1
  114. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +2 -0
  115. package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +1 -0
  116. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +43 -0
  117. package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +1 -0
  118. package/dist/tests/unit/api/ja4Middleware.unit.test.js +18 -4
  119. package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -1
  120. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +30 -18
  121. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -1
  122. package/dist/tests/unit/tasks/captchaManager.unit.test.js +11 -5
  123. package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -1
  124. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +43 -19
  125. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -1
  126. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +11 -4
  127. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -1
  128. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +9 -8
  129. package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -1
  130. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +29 -10
  131. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -1
  132. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +2 -3
  133. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -1
  134. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +4 -2
  135. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -1
  136. package/dist/tests/unit/util.unit.test.js +110 -2
  137. package/dist/tests/unit/util.unit.test.js.map +1 -1
  138. package/dist/util.d.ts +5 -0
  139. package/dist/util.d.ts.map +1 -1
  140. package/dist/util.js +57 -5
  141. package/dist/util.js.map +1 -1
  142. package/package.json +23 -19
  143. package/vite.test.config.ts +1 -1
  144. package/dist/api/authMiddleware.d.ts +0 -6
  145. package/dist/api/authMiddleware.d.ts.map +0 -1
  146. package/dist/api/authMiddleware.js +0 -82
  147. package/dist/api/authMiddleware.js.map +0 -1
  148. package/dist/api/requestLoggerMiddleware.d.ts +0 -4
  149. package/dist/api/requestLoggerMiddleware.d.ts.map +0 -1
  150. package/dist/api/requestLoggerMiddleware.js +0 -12
  151. package/dist/api/requestLoggerMiddleware.js.map +0 -1
  152. package/dist/cjs/api/authMiddleware.cjs +0 -81
  153. package/dist/cjs/api/requestLoggerMiddleware.cjs +0 -14
  154. package/dist/tests/unit/api/authMiddleware.unit.test.d.ts +0 -2
  155. package/dist/tests/unit/api/authMiddleware.unit.test.d.ts.map +0 -1
  156. package/dist/tests/unit/api/authMiddleware.unit.test.js +0 -125
  157. package/dist/tests/unit/api/authMiddleware.unit.test.js.map +0 -1
@@ -1,125 +0,0 @@
1
- import { hexToU8a, isHex } from "@polkadot/util";
2
- import { ProsopoApiError, ProsopoEnvError } from "@prosopo/common";
3
- import { describe, expect, it, vi } from "vitest";
4
- import { authMiddleware } from "../../../api/authMiddleware.js";
5
- vi.mock("@polkadot/util", () => ({
6
- hexToU8a: vi.fn(),
7
- isHex: vi.fn(),
8
- }));
9
- const mockLogger = {
10
- info: vi.fn(),
11
- error: vi.fn(),
12
- warn: vi.fn(),
13
- };
14
- const mockTasks = {};
15
- const mockPair = {
16
- publicKey: "mockPublicKey",
17
- verify: vi.fn(),
18
- };
19
- const mockEnv = {
20
- pair: mockPair,
21
- authAccount: mockPair,
22
- logger: mockLogger,
23
- };
24
- describe("authMiddleware", () => {
25
- it("should call next() if signature is valid", async () => {
26
- const mockReq = {
27
- url: "/v1/prosopo/provider/captcha/image",
28
- originalUrl: "/v1/prosopo/provider/captcha/image",
29
- headers: {
30
- signature: "0x1234",
31
- timestamp: new Date().getTime(),
32
- },
33
- logger: mockLogger,
34
- };
35
- const mockRes = {
36
- status: vi.fn().mockReturnThis(),
37
- json: vi.fn(),
38
- };
39
- const mockNext = vi.fn();
40
- vi.mocked(isHex).mockReturnValue(true);
41
- vi.mocked(hexToU8a).mockReturnValue(new Uint8Array());
42
- vi.mocked(mockPair.verify).mockReturnValue(true);
43
- const middleware = authMiddleware(mockEnv);
44
- await middleware(mockReq, mockRes, mockNext);
45
- expect(mockNext).toHaveBeenCalled();
46
- expect(mockRes.status).not.toHaveBeenCalled();
47
- });
48
- it("should return 401 if signature is invalid", async () => {
49
- const mockReq = {
50
- url: "/v1/prosopo/provider/captcha/image",
51
- originalUrl: "/v1/prosopo/provider/captcha/image",
52
- headers: {
53
- signature: "0x1234",
54
- timestamp: new Date().getTime(),
55
- },
56
- logger: mockLogger,
57
- };
58
- const mockRes = {
59
- status: vi.fn().mockReturnThis(),
60
- json: vi.fn(),
61
- };
62
- const mockNext = vi.fn();
63
- vi.mocked(isHex).mockReturnValue(true);
64
- vi.mocked(hexToU8a).mockReturnValue(new Uint8Array());
65
- vi.mocked(mockPair.verify).mockReturnValue(false);
66
- const middleware = authMiddleware(mockEnv);
67
- await middleware(mockReq, mockRes, mockNext);
68
- expect(mockNext).not.toHaveBeenCalled();
69
- expect(mockRes.status).toHaveBeenCalledWith(401);
70
- expect(mockRes.json).toHaveBeenCalledWith({
71
- error: "Unauthorized",
72
- message: expect.any(ProsopoApiError),
73
- });
74
- });
75
- it("should return 401 if key pair is missing", async () => {
76
- const mockReq = {
77
- url: "/v1/prosopo/provider/captcha/image",
78
- originalUrl: "/v1/prosopo/provider/captcha/image",
79
- headers: {
80
- signature: "0x1234",
81
- timestamp: new Date().getTime(),
82
- },
83
- logger: mockLogger,
84
- };
85
- const mockRes = {
86
- status: vi.fn().mockReturnThis(),
87
- json: vi.fn(),
88
- };
89
- const mockNext = vi.fn();
90
- const invalidEnv = {
91
- pair: null,
92
- };
93
- const middleware = authMiddleware(invalidEnv);
94
- await middleware(mockReq, mockRes, mockNext);
95
- expect(mockNext).not.toHaveBeenCalled();
96
- expect(mockRes.status).toHaveBeenCalledWith(401);
97
- expect(mockRes.json).toHaveBeenCalledWith({
98
- error: "Unauthorized",
99
- message: expect.any(ProsopoEnvError),
100
- });
101
- });
102
- it("should 404 if url does not contain /v1/prosopo", async () => {
103
- const mockReq = {
104
- url: "/favicon.ico",
105
- originalUrl: "/favicon.ico",
106
- headers: {
107
- signature: "0x1234",
108
- timestamp: new Date().getTime(),
109
- },
110
- logger: mockLogger,
111
- };
112
- const mockRes = {
113
- status: vi.fn().mockReturnThis(),
114
- statusCode: 404,
115
- json: vi.fn(),
116
- };
117
- const mockNext = vi.fn(() => {
118
- console.log("mock next function");
119
- });
120
- const middleware = authMiddleware(mockEnv);
121
- await middleware(mockReq, mockRes, mockNext);
122
- expect(mockRes.statusCode).toBe(404);
123
- });
124
- });
125
- //# sourceMappingURL=authMiddleware.unit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authMiddleware.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/api/authMiddleware.unit.test.ts"],"names":[],"mappings":"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"}