@prosopo/user-access-policy 3.4.0 → 3.5.27

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 (292) hide show
  1. package/CHANGELOG.md +309 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +786 -0
  5. package/coverage/coverage-final.json +15 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +146 -0
  8. package/coverage/prettify.css +1 -0
  9. package/coverage/prettify.js +2 -0
  10. package/coverage/sort-arrow-sprite.png +0 -0
  11. package/coverage/sorter.js +210 -0
  12. package/coverage/src/accessPolicy.ts.html +457 -0
  13. package/coverage/src/accessPolicyResolver.ts.html +211 -0
  14. package/coverage/src/accessRules.ts.html +265 -0
  15. package/coverage/src/api/accessRuleApiRoutes.ts.html +379 -0
  16. package/coverage/src/api/accessRulesApiClient.ts.html +274 -0
  17. package/coverage/src/api/deleteAllRulesEndpoint.ts.html +229 -0
  18. package/coverage/src/api/deleteRulesEndpoint.ts.html +301 -0
  19. package/coverage/src/api/index.html +176 -0
  20. package/coverage/src/api/insertRulesEndpoint.ts.html +436 -0
  21. package/coverage/src/index.html +176 -0
  22. package/coverage/src/index.ts.html +277 -0
  23. package/coverage/src/redis/index.html +161 -0
  24. package/coverage/src/redis/redisRulesIndex.ts.html +769 -0
  25. package/coverage/src/redis/redisRulesReader.ts.html +652 -0
  26. package/coverage/src/redis/redisRulesStorage.ts.html +229 -0
  27. package/coverage/src/redis/redisRulesWriter.ts.html +424 -0
  28. package/coverage/src/util.ts.html +136 -0
  29. package/dist/.export.d.ts +6 -0
  30. package/dist/.export.d.ts.map +1 -0
  31. package/dist/.export.js +21 -0
  32. package/dist/.export.js.map +1 -0
  33. package/dist/accessPolicy.d.ts +169 -0
  34. package/dist/accessPolicy.d.ts.map +1 -0
  35. package/dist/accessPolicy.js.map +1 -0
  36. package/dist/accessPolicyResolver.d.ts +110 -0
  37. package/dist/accessPolicyResolver.d.ts.map +1 -0
  38. package/dist/accessPolicyResolver.js.map +1 -0
  39. package/dist/accessRules.d.ts +16 -0
  40. package/dist/accessRules.d.ts.map +1 -0
  41. package/dist/accessRules.js.map +1 -0
  42. package/dist/api/.export.d.ts +7 -0
  43. package/dist/api/.export.d.ts.map +1 -0
  44. package/dist/api/.export.js +11 -0
  45. package/dist/api/.export.js.map +1 -0
  46. package/dist/api/accessRuleApiRoutes.d.ts +27 -0
  47. package/dist/api/accessRuleApiRoutes.d.ts.map +1 -0
  48. package/dist/api/accessRuleApiRoutes.js.map +1 -0
  49. package/dist/api/accessRulesApiClient.d.ts +10 -0
  50. package/dist/api/accessRulesApiClient.d.ts.map +1 -0
  51. package/dist/api/accessRulesApiClient.js +38 -0
  52. package/dist/api/accessRulesApiClient.js.map +1 -0
  53. package/dist/api/delete/.export.d.ts +2 -0
  54. package/dist/api/delete/.export.d.ts.map +1 -0
  55. package/dist/api/delete/.export.js +1 -0
  56. package/dist/api/delete/.export.js.map +1 -0
  57. package/dist/api/delete/deleteAllRules.d.ts +11 -0
  58. package/dist/api/delete/deleteAllRules.d.ts.map +1 -0
  59. package/dist/api/delete/deleteAllRules.js +25 -0
  60. package/dist/api/delete/deleteAllRules.js.map +1 -0
  61. package/dist/api/delete/deleteRuleGroups.d.ts +19 -0
  62. package/dist/api/delete/deleteRuleGroups.d.ts.map +1 -0
  63. package/dist/api/delete/deleteRuleGroups.js +52 -0
  64. package/dist/api/delete/deleteRuleGroups.js.map +1 -0
  65. package/dist/api/delete/deleteRules.d.ts +15 -0
  66. package/dist/api/delete/deleteRules.d.ts.map +1 -0
  67. package/dist/api/delete/deleteRules.js +43 -0
  68. package/dist/api/delete/deleteRules.js.map +1 -0
  69. package/dist/api/deleteAllRulesEndpoint.d.ts +12 -0
  70. package/dist/api/deleteAllRulesEndpoint.d.ts.map +1 -0
  71. package/dist/api/deleteAllRulesEndpoint.js.map +1 -0
  72. package/dist/api/deleteRulesEndpoint.d.ts +116 -0
  73. package/dist/api/deleteRulesEndpoint.d.ts.map +1 -0
  74. package/dist/api/deleteRulesEndpoint.js.map +1 -0
  75. package/dist/api/insertRulesEndpoint.d.ts +22 -0
  76. package/dist/api/insertRulesEndpoint.d.ts.map +1 -0
  77. package/dist/api/insertRulesEndpoint.js.map +1 -0
  78. package/dist/api/read/.export.d.ts +4 -0
  79. package/dist/api/read/.export.d.ts.map +1 -0
  80. package/dist/api/read/.export.js +1 -0
  81. package/dist/api/read/.export.js.map +1 -0
  82. package/dist/api/read/fetchRules.d.ts +53 -0
  83. package/dist/api/read/fetchRules.d.ts.map +1 -0
  84. package/dist/api/read/fetchRules.js +43 -0
  85. package/dist/api/read/fetchRules.js.map +1 -0
  86. package/dist/api/read/findRuleIds.d.ts +28 -0
  87. package/dist/api/read/findRuleIds.d.ts.map +1 -0
  88. package/dist/api/read/findRuleIds.js +50 -0
  89. package/dist/api/read/findRuleIds.js.map +1 -0
  90. package/dist/api/read/getMissingIds.d.ts +28 -0
  91. package/dist/api/read/getMissingIds.d.ts.map +1 -0
  92. package/dist/api/read/getMissingIds.js +41 -0
  93. package/dist/api/read/getMissingIds.js.map +1 -0
  94. package/dist/api/ruleApiRoutes.d.ts +43 -0
  95. package/dist/api/ruleApiRoutes.d.ts.map +1 -0
  96. package/dist/api/ruleApiRoutes.js +131 -0
  97. package/dist/api/ruleApiRoutes.js.map +1 -0
  98. package/dist/api/rulesApiClient.d.ts +20 -0
  99. package/dist/api/rulesApiClient.d.ts.map +1 -0
  100. package/dist/api/rulesApiClient.js +93 -0
  101. package/dist/api/rulesApiClient.js.map +1 -0
  102. package/dist/api/write/.export.d.ts +2 -0
  103. package/dist/api/write/.export.d.ts.map +1 -0
  104. package/dist/api/write/.export.js +1 -0
  105. package/dist/api/write/.export.js.map +1 -0
  106. package/dist/api/write/insertRules.d.ts +29 -0
  107. package/dist/api/write/insertRules.d.ts.map +1 -0
  108. package/dist/api/write/insertRules.js +102 -0
  109. package/dist/api/write/insertRules.js.map +1 -0
  110. package/dist/api/write/rehashRules.d.ts +11 -0
  111. package/dist/api/write/rehashRules.d.ts.map +1 -0
  112. package/dist/api/write/rehashRules.js +57 -0
  113. package/dist/api/write/rehashRules.js.map +1 -0
  114. package/dist/cjs/.export.cjs +21 -0
  115. package/dist/cjs/api/.export.cjs +11 -0
  116. package/dist/cjs/api/delete/.export.cjs +1 -0
  117. package/dist/cjs/api/delete/deleteAllRules.cjs +25 -0
  118. package/dist/cjs/api/delete/deleteRuleGroups.cjs +52 -0
  119. package/dist/cjs/api/delete/deleteRules.cjs +43 -0
  120. package/dist/cjs/api/read/.export.cjs +1 -0
  121. package/dist/cjs/api/read/fetchRules.cjs +43 -0
  122. package/dist/cjs/api/read/findRuleIds.cjs +50 -0
  123. package/dist/cjs/api/read/getMissingIds.cjs +41 -0
  124. package/dist/cjs/api/ruleApiRoutes.cjs +131 -0
  125. package/dist/cjs/api/rulesApiClient.cjs +93 -0
  126. package/dist/cjs/api/write/.export.cjs +1 -0
  127. package/dist/cjs/api/write/insertRules.cjs +102 -0
  128. package/dist/cjs/api/write/rehashRules.cjs +57 -0
  129. package/dist/cjs/index.cjs +2 -0
  130. package/dist/cjs/mongoose/.export.cjs +4 -0
  131. package/dist/cjs/mongoose/mongooseRuleSchema.cjs +36 -0
  132. package/dist/cjs/redis/.export.cjs +6 -0
  133. package/dist/cjs/redis/reader/redisAggregate.cjs +60 -0
  134. package/dist/cjs/redis/reader/redisRulesQuery.cjs +99 -0
  135. package/dist/cjs/redis/reader/redisRulesReader.cjs +230 -0
  136. package/dist/cjs/redis/redisAccessRules.cjs +4 -4
  137. package/dist/cjs/redis/redisAccessRulesIndex.cjs +55 -14
  138. package/dist/cjs/redis/redisClient.cjs +67 -0
  139. package/dist/cjs/redis/redisRuleIndex.cjs +50 -0
  140. package/dist/cjs/redis/redisRulesStorage.cjs +34 -0
  141. package/dist/cjs/redis/redisRulesWriter.cjs +100 -0
  142. package/dist/cjs/rule.cjs +8 -0
  143. package/dist/cjs/ruleInput/.export.cjs +9 -0
  144. package/dist/cjs/ruleInput/policyInput.cjs +25 -0
  145. package/dist/cjs/ruleInput/ruleInput.cjs +50 -0
  146. package/dist/cjs/ruleInput/userScopeInput.cjs +55 -0
  147. package/dist/cjs/ruleRecord.cjs +23 -0
  148. package/dist/cjs/rulesStorage.cjs +8 -0
  149. package/dist/cjs/transformRule.cjs +77 -0
  150. package/dist/index.d.ts +15 -0
  151. package/dist/index.d.ts.map +1 -0
  152. package/dist/index.js +7 -3
  153. package/dist/index.js.map +1 -0
  154. package/dist/mongoose/.export.d.ts +2 -0
  155. package/dist/mongoose/.export.d.ts.map +1 -0
  156. package/dist/mongoose/.export.js +4 -0
  157. package/dist/mongoose/.export.js.map +1 -0
  158. package/dist/mongoose/mongooseRuleSchema.d.ts +4 -0
  159. package/dist/mongoose/mongooseRuleSchema.d.ts.map +1 -0
  160. package/dist/mongoose/mongooseRuleSchema.js +36 -0
  161. package/dist/mongoose/mongooseRuleSchema.js.map +1 -0
  162. package/dist/redis/.export.d.ts +3 -0
  163. package/dist/redis/.export.d.ts.map +1 -0
  164. package/dist/redis/.export.js +6 -0
  165. package/dist/redis/.export.js.map +1 -0
  166. package/dist/redis/reader/redisAggregate.d.ts +4 -0
  167. package/dist/redis/reader/redisAggregate.d.ts.map +1 -0
  168. package/dist/redis/reader/redisAggregate.js +60 -0
  169. package/dist/redis/reader/redisAggregate.js.map +1 -0
  170. package/dist/redis/reader/redisRulesQuery.d.ts +4 -0
  171. package/dist/redis/reader/redisRulesQuery.d.ts.map +1 -0
  172. package/dist/redis/reader/redisRulesQuery.js +99 -0
  173. package/dist/redis/reader/redisRulesQuery.js.map +1 -0
  174. package/dist/redis/reader/redisRulesReader.d.ts +26 -0
  175. package/dist/redis/reader/redisRulesReader.d.ts.map +1 -0
  176. package/dist/redis/reader/redisRulesReader.js +213 -0
  177. package/dist/redis/reader/redisRulesReader.js.map +1 -0
  178. package/dist/redis/redisAccessRules.d.ts +7 -0
  179. package/dist/redis/redisAccessRules.d.ts.map +1 -0
  180. package/dist/redis/redisAccessRules.js +112 -128
  181. package/dist/redis/redisAccessRules.js.map +1 -0
  182. package/dist/redis/redisAccessRulesIndex.d.ts +13 -0
  183. package/dist/redis/redisAccessRulesIndex.d.ts.map +1 -0
  184. package/dist/redis/redisAccessRulesIndex.js +122 -112
  185. package/dist/redis/redisAccessRulesIndex.js.map +1 -0
  186. package/dist/redis/redisClient.d.ts +11 -0
  187. package/dist/redis/redisClient.d.ts.map +1 -0
  188. package/dist/redis/redisClient.js +67 -0
  189. package/dist/redis/redisClient.js.map +1 -0
  190. package/dist/redis/redisIndex.d.ts +9 -0
  191. package/dist/redis/redisIndex.d.ts.map +1 -0
  192. package/dist/redis/redisIndex.js +16 -15
  193. package/dist/redis/redisIndex.js.map +1 -0
  194. package/dist/redis/redisRuleIndex.d.ts +13 -0
  195. package/dist/redis/redisRuleIndex.d.ts.map +1 -0
  196. package/dist/redis/redisRuleIndex.js +50 -0
  197. package/dist/redis/redisRuleIndex.js.map +1 -0
  198. package/dist/redis/redisRulesIndex.d.ts +9 -0
  199. package/dist/redis/redisRulesIndex.d.ts.map +1 -0
  200. package/dist/redis/redisRulesIndex.js +138 -0
  201. package/dist/redis/redisRulesIndex.js.map +1 -0
  202. package/dist/redis/redisRulesReader.d.ts +6 -0
  203. package/dist/redis/redisRulesReader.d.ts.map +1 -0
  204. package/dist/redis/redisRulesReader.js +125 -0
  205. package/dist/redis/redisRulesReader.js.map +1 -0
  206. package/dist/redis/redisRulesStorage.d.ts +5 -0
  207. package/dist/redis/redisRulesStorage.d.ts.map +1 -0
  208. package/dist/redis/redisRulesStorage.js +34 -0
  209. package/dist/redis/redisRulesStorage.js.map +1 -0
  210. package/dist/redis/redisRulesWriter.d.ts +22 -0
  211. package/dist/redis/redisRulesWriter.d.ts.map +1 -0
  212. package/dist/redis/redisRulesWriter.js +100 -0
  213. package/dist/redis/redisRulesWriter.js.map +1 -0
  214. package/dist/rule.d.ts +34 -0
  215. package/dist/rule.d.ts.map +1 -0
  216. package/dist/rule.js +8 -0
  217. package/dist/rule.js.map +1 -0
  218. package/dist/ruleInput/.export.d.ts +4 -0
  219. package/dist/ruleInput/.export.d.ts.map +1 -0
  220. package/dist/ruleInput/.export.js +9 -0
  221. package/dist/ruleInput/.export.js.map +1 -0
  222. package/dist/ruleInput/policyInput.d.ts +38 -0
  223. package/dist/ruleInput/policyInput.d.ts.map +1 -0
  224. package/dist/ruleInput/policyInput.js +25 -0
  225. package/dist/ruleInput/policyInput.js.map +1 -0
  226. package/dist/ruleInput/ruleInput.d.ts +145 -0
  227. package/dist/ruleInput/ruleInput.d.ts.map +1 -0
  228. package/dist/ruleInput/ruleInput.js +50 -0
  229. package/dist/ruleInput/ruleInput.js.map +1 -0
  230. package/dist/ruleInput/userScopeInput.d.ts +93 -0
  231. package/dist/ruleInput/userScopeInput.d.ts.map +1 -0
  232. package/dist/ruleInput/userScopeInput.js +55 -0
  233. package/dist/ruleInput/userScopeInput.js.map +1 -0
  234. package/dist/ruleRecord.d.ts +18 -0
  235. package/dist/ruleRecord.d.ts.map +1 -0
  236. package/dist/ruleRecord.js +23 -0
  237. package/dist/ruleRecord.js.map +1 -0
  238. package/dist/rulesStorage.d.ts +30 -0
  239. package/dist/rulesStorage.d.ts.map +1 -0
  240. package/dist/rulesStorage.js +8 -0
  241. package/dist/rulesStorage.js.map +1 -0
  242. package/dist/tests/accessPolicy.test.d.ts +2 -0
  243. package/dist/tests/accessPolicy.test.d.ts.map +1 -0
  244. package/dist/tests/accessPolicy.test.js +27 -0
  245. package/dist/tests/accessPolicy.test.js.map +1 -0
  246. package/dist/tests/redis/reader/redisRulesQuery.unit.test.d.ts +2 -0
  247. package/dist/tests/redis/reader/redisRulesQuery.unit.test.d.ts.map +1 -0
  248. package/dist/tests/redis/reader/redisRulesQuery.unit.test.js +101 -0
  249. package/dist/tests/redis/reader/redisRulesQuery.unit.test.js.map +1 -0
  250. package/dist/tests/redis/redisAccessRules.integration.test.d.ts +2 -0
  251. package/dist/tests/redis/redisAccessRules.integration.test.d.ts.map +1 -0
  252. package/dist/tests/redis/redisAccessRules.integration.test.js +586 -0
  253. package/dist/tests/redis/redisAccessRules.integration.test.js.map +1 -0
  254. package/dist/tests/redis/redisAccessRules.unit.test.d.ts +2 -0
  255. package/dist/tests/redis/redisAccessRules.unit.test.d.ts.map +1 -0
  256. package/dist/tests/redis/redisAccessRules.unit.test.js +198 -0
  257. package/dist/tests/redis/redisAccessRules.unit.test.js.map +1 -0
  258. package/dist/tests/redis/redisIndex.integration.test.d.ts +2 -0
  259. package/dist/tests/redis/redisIndex.integration.test.d.ts.map +1 -0
  260. package/dist/tests/redis/redisIndex.integration.test.js +80 -0
  261. package/dist/tests/redis/redisIndex.integration.test.js.map +1 -0
  262. package/dist/tests/redis/redisRulesIndex.unit.test.d.ts +2 -0
  263. package/dist/tests/redis/redisRulesIndex.unit.test.d.ts.map +1 -0
  264. package/dist/tests/redis/redisRulesIndex.unit.test.js +101 -0
  265. package/dist/tests/redis/redisRulesIndex.unit.test.js.map +1 -0
  266. package/dist/tests/redis/redisRulesStorage.integration.test.d.ts +2 -0
  267. package/dist/tests/redis/redisRulesStorage.integration.test.d.ts.map +1 -0
  268. package/dist/tests/redis/redisRulesStorage.integration.test.js +611 -0
  269. package/dist/tests/redis/redisRulesStorage.integration.test.js.map +1 -0
  270. package/dist/tests/redis/testRedisClient.d.ts +3 -0
  271. package/dist/tests/redis/testRedisClient.d.ts.map +1 -0
  272. package/dist/tests/redis/testRedisClient.js +8 -0
  273. package/dist/tests/redis/testRedisClient.js.map +1 -0
  274. package/dist/tests/testLogger.d.ts +4 -0
  275. package/dist/tests/testLogger.d.ts.map +1 -0
  276. package/dist/tests/testLogger.js +22 -0
  277. package/dist/tests/testLogger.js.map +1 -0
  278. package/dist/tests/transformRule.unit.test.d.ts +2 -0
  279. package/dist/tests/transformRule.unit.test.d.ts.map +1 -0
  280. package/dist/tests/transformRule.unit.test.js +188 -0
  281. package/dist/tests/transformRule.unit.test.js.map +1 -0
  282. package/dist/transformRule.d.ts +7 -0
  283. package/dist/transformRule.d.ts.map +1 -0
  284. package/dist/transformRule.js +77 -0
  285. package/dist/transformRule.js.map +1 -0
  286. package/dist/util.d.ts +2 -0
  287. package/dist/util.d.ts.map +1 -0
  288. package/dist/util.js.map +1 -0
  289. package/entries.ts +20 -0
  290. package/package.json +42 -21
  291. package/vite.cjs.config.ts +4 -1
  292. package/vite.esm.config.ts +6 -1
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const common = require("@prosopo/common");
5
+ const zod = require("zod");
6
+ const ruleInput = require("../../ruleInput/ruleInput.cjs");
7
+ class DeleteRulesEndpoint {
8
+ constructor(accessRulesStorage, logger) {
9
+ this.accessRulesStorage = accessRulesStorage;
10
+ this.logger = logger;
11
+ }
12
+ getRequestArgsSchema() {
13
+ return zod.z.array(ruleInput.accessRulesFilterInput);
14
+ }
15
+ async processRequest(args) {
16
+ let deletedCount = 0;
17
+ for (const rulesFilterInput of args) {
18
+ const ruleFilters = ruleInput.getAccessRuleFiltersFromInput(rulesFilterInput);
19
+ await common.executeBatchesSequentially(ruleFilters, async (ruleFilter) => {
20
+ const ruleIds = await this.accessRulesStorage.findRuleIds(ruleFilter);
21
+ const uniqueRuleIds = [...new Set(ruleIds)];
22
+ if (uniqueRuleIds.length > 0) {
23
+ await this.accessRulesStorage.deleteRules(uniqueRuleIds);
24
+ deletedCount += uniqueRuleIds.length;
25
+ this.logger.info(() => ({
26
+ msg: "Endpoint deleted rules",
27
+ data: {
28
+ rulesFilterInput,
29
+ uniqueRuleIds
30
+ }
31
+ }));
32
+ }
33
+ });
34
+ }
35
+ return {
36
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
37
+ data: {
38
+ deleted_count: deletedCount
39
+ }
40
+ };
41
+ }
42
+ }
43
+ exports.DeleteRulesEndpoint = DeleteRulesEndpoint;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const zod = require("zod");
5
+ const ruleInput = require("../../ruleInput/ruleInput.cjs");
6
+ const fetchRulesResponse = zod.z.object({
7
+ ruleEntries: ruleInput.ruleEntryInput.array()
8
+ });
9
+ class FetchRulesEndpoint {
10
+ constructor(accessRulesStorage, logger) {
11
+ this.accessRulesStorage = accessRulesStorage;
12
+ this.logger = logger;
13
+ }
14
+ getRequestArgsSchema() {
15
+ return zod.z.object({
16
+ ids: zod.z.string().array()
17
+ });
18
+ }
19
+ async processRequest(args) {
20
+ const ruleEntries = await this.accessRulesStorage.fetchRules(args.ids);
21
+ this.logger.info(() => ({
22
+ msg: "Endpoint fetched rules",
23
+ data: {
24
+ requestedCount: args.ids.length,
25
+ foundCount: ruleEntries.length
26
+ }
27
+ }));
28
+ this.logger.debug(() => ({
29
+ msg: "Fetched rule details",
30
+ data: {
31
+ ruleEntries
32
+ }
33
+ }));
34
+ return {
35
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
36
+ data: {
37
+ ruleEntries
38
+ }
39
+ };
40
+ }
41
+ }
42
+ exports.FetchRulesEndpoint = FetchRulesEndpoint;
43
+ exports.fetchRulesResponse = fetchRulesResponse;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const common = require("@prosopo/common");
5
+ const zod = require("zod");
6
+ const ruleInput = require("../../ruleInput/ruleInput.cjs");
7
+ const ruleIdsResponse = zod.z.object({
8
+ ruleIds: zod.z.string().array()
9
+ });
10
+ class FindRuleIdsEndpoint {
11
+ constructor(accessRulesStorage, logger) {
12
+ this.accessRulesStorage = accessRulesStorage;
13
+ this.logger = logger;
14
+ }
15
+ getRequestArgsSchema() {
16
+ return zod.z.array(ruleInput.accessRulesFilterInput);
17
+ }
18
+ async processRequest(args) {
19
+ const ruleIdBatches = await common.executeBatchesSequentially(
20
+ args,
21
+ async (rulesFilterInput) => {
22
+ const ruleFilters = ruleInput.getAccessRuleFiltersFromInput(rulesFilterInput);
23
+ const ruleIds2 = await common.executeBatchesSequentially(
24
+ ruleFilters,
25
+ (ruleFilter) => this.accessRulesStorage.findRuleIds(ruleFilter)
26
+ );
27
+ return ruleIds2.flat();
28
+ }
29
+ );
30
+ const ruleIds = ruleIdBatches.flat();
31
+ const uniqueRuleIds = [...new Set(ruleIds)];
32
+ this.logger.info(() => ({
33
+ msg: "Endpoint found rules",
34
+ data: {
35
+ totalFoundCount: ruleIds.length,
36
+ uniqueFoundCount: uniqueRuleIds.length,
37
+ searchFilters: args,
38
+ foundIds: uniqueRuleIds
39
+ }
40
+ }));
41
+ return {
42
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
43
+ data: {
44
+ ruleIds: uniqueRuleIds
45
+ }
46
+ };
47
+ }
48
+ }
49
+ exports.FindRuleIdsEndpoint = FindRuleIdsEndpoint;
50
+ exports.ruleIdsResponse = ruleIdsResponse;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const zod = require("zod");
5
+ const missingIdsResponse = zod.z.object({
6
+ ids: zod.z.string().array()
7
+ });
8
+ class GetMissingIdsEndpoint {
9
+ constructor(accessRulesStorage, logger) {
10
+ this.accessRulesStorage = accessRulesStorage;
11
+ this.logger = logger;
12
+ }
13
+ getRequestArgsSchema() {
14
+ return zod.z.string().array();
15
+ }
16
+ async processRequest(args) {
17
+ const missingIds = await this.accessRulesStorage.getMissingRuleIds(args);
18
+ this.logger.info(() => ({
19
+ msg: "Endpoint checked missing ids",
20
+ data: {
21
+ idsToCheck: args.length,
22
+ missingIds: missingIds.length
23
+ }
24
+ }));
25
+ this.logger.debug(() => ({
26
+ msg: "Missing id details",
27
+ data: {
28
+ idsToCheck: args,
29
+ missingIds
30
+ }
31
+ }));
32
+ return {
33
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
34
+ data: {
35
+ ids: missingIds
36
+ }
37
+ };
38
+ }
39
+ }
40
+ exports.GetMissingIdsEndpoint = GetMissingIdsEndpoint;
41
+ exports.missingIdsResponse = missingIdsResponse;
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const fetchRules = require("./read/fetchRules.cjs");
4
+ const findRuleIds = require("./read/findRuleIds.cjs");
5
+ const getMissingIds = require("./read/getMissingIds.cjs");
6
+ const rehashRules = require("./write/rehashRules.cjs");
7
+ const deleteAllRules = require("./delete/deleteAllRules.cjs");
8
+ const deleteRuleGroups = require("./delete/deleteRuleGroups.cjs");
9
+ const deleteRules = require("./delete/deleteRules.cjs");
10
+ const insertRules = require("./write/insertRules.cjs");
11
+ var accessRuleApiPaths = /* @__PURE__ */ ((accessRuleApiPaths2) => {
12
+ accessRuleApiPaths2["DELETE_ALL"] = "/v1/prosopo/user-access-policy/rules/delete-all";
13
+ accessRuleApiPaths2["DELETE_GROUPS"] = "/v1/prosopo/user-access-policy/rules/delete-groups";
14
+ accessRuleApiPaths2["DELETE_MANY"] = "/v1/prosopo/user-access-policy/rules/delete-many";
15
+ accessRuleApiPaths2["FETCH_MANY"] = "/v1/prosopo/user-access-policy/rules/fetch-many";
16
+ accessRuleApiPaths2["FIND_IDS"] = "/v1/prosopo/user-access-policy/rules/find-ids";
17
+ accessRuleApiPaths2["GET_MISSING_IDS"] = "/v1/prosopo/user-access-policy/rules/get-missing-ids";
18
+ accessRuleApiPaths2["INSERT_MANY"] = "/v1/prosopo/user-access-policy/rules/insert-many";
19
+ accessRuleApiPaths2["REHASH_ALL"] = "/v1/prosopo/user-access-policy/rules/rehash-all";
20
+ return accessRuleApiPaths2;
21
+ })(accessRuleApiPaths || {});
22
+ class AccessRuleApiRoutes {
23
+ constructor(accessRulesStorage, logger) {
24
+ this.accessRulesStorage = accessRulesStorage;
25
+ this.logger = logger;
26
+ }
27
+ getRoutes() {
28
+ return {
29
+ ...this.makeDeleteEndpoints(),
30
+ ...this.makeReadEndpoints(),
31
+ ...this.makeWriteEndpoints()
32
+ };
33
+ }
34
+ makeDeleteEndpoints() {
35
+ return {
36
+ [
37
+ "/v1/prosopo/user-access-policy/rules/delete-all"
38
+ /* DELETE_ALL */
39
+ ]: new deleteAllRules.DeleteAllRulesEndpoint(
40
+ this.accessRulesStorage,
41
+ this.logger
42
+ ),
43
+ [
44
+ "/v1/prosopo/user-access-policy/rules/delete-groups"
45
+ /* DELETE_GROUPS */
46
+ ]: new deleteRuleGroups.DeleteRuleGroupsEndpoint(
47
+ this.accessRulesStorage,
48
+ this.logger
49
+ ),
50
+ [
51
+ "/v1/prosopo/user-access-policy/rules/delete-many"
52
+ /* DELETE_MANY */
53
+ ]: new deleteRules.DeleteRulesEndpoint(
54
+ this.accessRulesStorage,
55
+ this.logger
56
+ )
57
+ };
58
+ }
59
+ makeReadEndpoints() {
60
+ return {
61
+ [
62
+ "/v1/prosopo/user-access-policy/rules/fetch-many"
63
+ /* FETCH_MANY */
64
+ ]: new fetchRules.FetchRulesEndpoint(
65
+ this.accessRulesStorage,
66
+ this.logger
67
+ ),
68
+ [
69
+ "/v1/prosopo/user-access-policy/rules/find-ids"
70
+ /* FIND_IDS */
71
+ ]: new findRuleIds.FindRuleIdsEndpoint(
72
+ this.accessRulesStorage,
73
+ this.logger
74
+ ),
75
+ [
76
+ "/v1/prosopo/user-access-policy/rules/get-missing-ids"
77
+ /* GET_MISSING_IDS */
78
+ ]: new getMissingIds.GetMissingIdsEndpoint(
79
+ this.accessRulesStorage,
80
+ this.logger
81
+ )
82
+ };
83
+ }
84
+ makeWriteEndpoints() {
85
+ return {
86
+ [
87
+ "/v1/prosopo/user-access-policy/rules/insert-many"
88
+ /* INSERT_MANY */
89
+ ]: new insertRules.InsertRulesEndpoint(
90
+ this.accessRulesStorage,
91
+ this.logger
92
+ ),
93
+ [
94
+ "/v1/prosopo/user-access-policy/rules/rehash-all"
95
+ /* REHASH_ALL */
96
+ ]: new rehashRules.RehashRulesEndpoint(
97
+ this.accessRulesStorage,
98
+ this.logger
99
+ )
100
+ };
101
+ }
102
+ }
103
+ const getExpressApiRuleRateLimits = () => {
104
+ const defaults = {
105
+ limit: 5,
106
+ windowSeconds: 10
107
+ };
108
+ const defaultWindowMs = defaults.windowSeconds * 1e3;
109
+ const rateLimitEntries = Object.entries(accessRuleApiPaths).map(
110
+ ([endpointName, endpointPath]) => [
111
+ endpointPath,
112
+ {
113
+ windowMs: getIntEnvironmentVariable(
114
+ `PROSOPO_USER_ACCESS_POLICY_RULE_${endpointName}_WINDOW`
115
+ ) || defaultWindowMs,
116
+ limit: getIntEnvironmentVariable(
117
+ `PROSOPO_USER_ACCESS_POLICY_RULE_${endpointName}_LIMIT`
118
+ ) || defaults.limit
119
+ }
120
+ ]
121
+ );
122
+ return Object.fromEntries(rateLimitEntries);
123
+ };
124
+ const getIntEnvironmentVariable = (variableName) => {
125
+ const variableValue = process.env[variableName];
126
+ const numericValue = variableValue ? Number.parseInt(variableValue) : Number.NaN;
127
+ return Number.isInteger(numericValue) ? numericValue : void 0;
128
+ };
129
+ exports.AccessRuleApiRoutes = AccessRuleApiRoutes;
130
+ exports.accessRuleApiPaths = accessRuleApiPaths;
131
+ exports.getExpressApiRuleRateLimits = getExpressApiRuleRateLimits;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const api = require("@prosopo/api");
4
+ const fetchRules = require("./read/fetchRules.cjs");
5
+ const findRuleIds = require("./read/findRuleIds.cjs");
6
+ const getMissingIds = require("./read/getMissingIds.cjs");
7
+ const ruleApiRoutes = require("./ruleApiRoutes.cjs");
8
+ class AccessRulesApiClient extends api.ApiClient {
9
+ //// delete
10
+ deleteMany(filters, timestamp, signature) {
11
+ return this.post(
12
+ ruleApiRoutes.accessRuleApiPaths.DELETE_MANY,
13
+ filters,
14
+ this.getAuthHeaders(timestamp, signature)
15
+ );
16
+ }
17
+ deleteGroups(siteGroups, timestamp, signature) {
18
+ return this.post(
19
+ ruleApiRoutes.accessRuleApiPaths.DELETE_GROUPS,
20
+ siteGroups,
21
+ this.getAuthHeaders(timestamp, signature)
22
+ );
23
+ }
24
+ deleteAll(timestamp, signature) {
25
+ return this.post(
26
+ ruleApiRoutes.accessRuleApiPaths.DELETE_ALL,
27
+ {},
28
+ this.getAuthHeaders(timestamp, signature)
29
+ );
30
+ }
31
+ //// read
32
+ async getMissingIds(idsToCheck, timestamp, signature) {
33
+ const endpointResponse = await this.post(
34
+ ruleApiRoutes.accessRuleApiPaths.GET_MISSING_IDS,
35
+ idsToCheck,
36
+ this.getAuthHeaders(timestamp, signature)
37
+ );
38
+ const parsedData = getMissingIds.missingIdsResponse.safeParse(endpointResponse.data);
39
+ return {
40
+ ...endpointResponse,
41
+ data: parsedData.success ? parsedData.data : void 0
42
+ };
43
+ }
44
+ async fetchMany(fetchOptions, timestamp, signature) {
45
+ const endpointResponse = await this.post(
46
+ ruleApiRoutes.accessRuleApiPaths.FETCH_MANY,
47
+ fetchOptions,
48
+ this.getAuthHeaders(timestamp, signature)
49
+ );
50
+ const parsedData = fetchRules.fetchRulesResponse.safeParse(endpointResponse.data);
51
+ return {
52
+ ...endpointResponse,
53
+ data: parsedData.success ? parsedData.data : void 0
54
+ };
55
+ }
56
+ async findIds(filters, timestamp, signature) {
57
+ const endpointResponse = await this.post(
58
+ ruleApiRoutes.accessRuleApiPaths.FIND_IDS,
59
+ filters,
60
+ this.getAuthHeaders(timestamp, signature)
61
+ );
62
+ const parsedData = findRuleIds.ruleIdsResponse.safeParse(endpointResponse.data);
63
+ return {
64
+ ...endpointResponse,
65
+ data: parsedData.success ? parsedData.data : void 0
66
+ };
67
+ }
68
+ //// write
69
+ async rehashAll(timestamp, signature) {
70
+ return this.post(
71
+ ruleApiRoutes.accessRuleApiPaths.REHASH_ALL,
72
+ {},
73
+ this.getAuthHeaders(timestamp, signature)
74
+ );
75
+ }
76
+ insertMany(ruleGroups, timestamp, signature) {
77
+ return this.post(
78
+ ruleApiRoutes.accessRuleApiPaths.INSERT_MANY,
79
+ ruleGroups,
80
+ this.getAuthHeaders(timestamp, signature)
81
+ );
82
+ }
83
+ getAuthHeaders(timestamp, signature) {
84
+ return {
85
+ headers: {
86
+ "Prosopo-Site-Key": this.account,
87
+ timestamp,
88
+ signature
89
+ }
90
+ };
91
+ }
92
+ }
93
+ exports.AccessRulesApiClient = AccessRulesApiClient;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const common = require("@prosopo/common");
5
+ const zod = require("zod");
6
+ const policyInput = require("../../ruleInput/policyInput.cjs");
7
+ const userScopeInput = require("../../ruleInput/userScopeInput.cjs");
8
+ class InsertRulesEndpoint {
9
+ constructor(accessRulesWriter, logger) {
10
+ this.accessRulesWriter = accessRulesWriter;
11
+ this.logger = logger;
12
+ }
13
+ getRequestArgsSchema() {
14
+ return zod.z.array(
15
+ zod.z.object({
16
+ accessPolicy: policyInput.accessPolicyInput,
17
+ policyScopes: zod.z.array(policyInput.policyScopeInput).optional(),
18
+ groupId: zod.z.string().optional(),
19
+ userScopes: zod.z.array(userScopeInput.userScopeInput),
20
+ expiresUnixTimestamp: zod.z.number().optional()
21
+ })
22
+ );
23
+ }
24
+ async processRequest(args) {
25
+ const timeoutPromise = new Promise((resolve) => {
26
+ setTimeout(() => {
27
+ resolve({
28
+ status: apiRoute.ApiEndpointResponseStatus.PROCESSING
29
+ });
30
+ }, 5e3);
31
+ });
32
+ const userScopesCount = args.reduce(
33
+ (userScopesCount2, group) => userScopesCount2 + group.userScopes.length,
34
+ 0
35
+ );
36
+ const createRulesPromise = this.createRuleGroups(args).then((insertedIds) => {
37
+ this.logger.info(() => ({
38
+ msg: "Endpoint inserted access rules",
39
+ data: {
40
+ userScopesCount,
41
+ insertedCount: insertedIds.length,
42
+ uniqueIdsCount: new Set(insertedIds).size
43
+ }
44
+ }));
45
+ this.logger.debug(() => ({
46
+ msg: "Inserted access rules details",
47
+ data: {
48
+ insertedIds,
49
+ input: args
50
+ }
51
+ }));
52
+ return {
53
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS
54
+ };
55
+ }).catch((error) => {
56
+ if (common.LogLevel.enum.debug === this.logger.getLogLevel()) {
57
+ this.logger.error(() => ({
58
+ err: error,
59
+ data: { args },
60
+ msg: "Failed to insert access rules"
61
+ }));
62
+ }
63
+ return {
64
+ status: apiRoute.ApiEndpointResponseStatus.FAIL
65
+ };
66
+ });
67
+ return Promise.race([timeoutPromise, createRulesPromise]);
68
+ }
69
+ async createRuleGroups(groups) {
70
+ const ruleIdPromises = groups.map((group) => this.createRulesGroup(group));
71
+ const ruleIdSets = await Promise.all(ruleIdPromises);
72
+ return ruleIdSets.flat();
73
+ }
74
+ async createRulesGroup(group) {
75
+ const ruleEntries = [];
76
+ const policyScopes = group.policyScopes || [];
77
+ for (const userScope of group.userScopes) {
78
+ const ruleBase = {
79
+ ...group.accessPolicy,
80
+ ...userScope,
81
+ ...group.groupId ? { groupId: group.groupId } : {}
82
+ };
83
+ if (policyScopes.length > 0) {
84
+ for (const policyScope of policyScopes) {
85
+ ruleEntries.push({
86
+ rule: {
87
+ ...ruleBase,
88
+ ...policyScope
89
+ }
90
+ });
91
+ }
92
+ } else {
93
+ ruleEntries.push({
94
+ rule: ruleBase,
95
+ expiresUnixTimestamp: group.expiresUnixTimestamp
96
+ });
97
+ }
98
+ }
99
+ return this.accessRulesWriter.insertRules(ruleEntries);
100
+ }
101
+ }
102
+ exports.InsertRulesEndpoint = InsertRulesEndpoint;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ class RehashRulesEndpoint {
5
+ constructor(accessRulesStorage, logger) {
6
+ this.accessRulesStorage = accessRulesStorage;
7
+ this.logger = logger;
8
+ }
9
+ getRequestArgsSchema() {
10
+ }
11
+ async processRequest() {
12
+ await this.accessRulesStorage.fetchAllRuleIds(async (ruleIds) => {
13
+ this.logger.info(() => ({
14
+ msg: "Fetched rule ids batch",
15
+ data: {
16
+ count: ruleIds.length,
17
+ ruleIds
18
+ }
19
+ }));
20
+ const ruleEntries = await this.accessRulesStorage.fetchRules(ruleIds);
21
+ this.logger.info(() => ({
22
+ msg: "Fetched rules",
23
+ data: {
24
+ count: ruleEntries.length
25
+ }
26
+ }));
27
+ if (ruleEntries.length !== ruleIds.length) {
28
+ this.logger.warn(() => ({
29
+ msg: "Fetched rules count is not equal to the requested count",
30
+ data: {
31
+ fetchedCount: ruleEntries.length,
32
+ requestedCount: ruleIds.length
33
+ }
34
+ }));
35
+ }
36
+ await this.accessRulesStorage.deleteRules(ruleIds);
37
+ this.logger.info(() => ({
38
+ msg: "Deleted rules",
39
+ data: {
40
+ count: ruleIds.length
41
+ }
42
+ }));
43
+ await this.accessRulesStorage.insertRules(ruleEntries);
44
+ this.logger.info(() => ({
45
+ msg: "Inserted rules",
46
+ data: {
47
+ count: ruleEntries.length
48
+ }
49
+ }));
50
+ });
51
+ return {
52
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
53
+ data: {}
54
+ };
55
+ }
56
+ }
57
+ exports.RehashRulesEndpoint = RehashRulesEndpoint;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const accessPolicy = require("./accessPolicy.cjs");
4
4
  const accessPolicyResolver = require("./accessPolicyResolver.cjs");
5
+ const accessRules = require("./accessRules.cjs");
5
6
  const accessRuleApiRoutes = require("./api/accessRuleApiRoutes.cjs");
6
7
  const deleteAllRulesEndpoint = require("./api/deleteAllRulesEndpoint.cjs");
7
8
  const deleteRulesEndpoint = require("./api/deleteRulesEndpoint.cjs");
@@ -17,6 +18,7 @@ exports.accessRuleSchemaExtended = accessPolicy.accessRuleSchemaExtended;
17
18
  exports.policyScopeSchema = accessPolicy.policyScopeSchema;
18
19
  exports.userScopeInputSchema = accessPolicy.userScopeInputSchema;
19
20
  exports.ScopeMatch = accessPolicyResolver.ScopeMatch;
21
+ exports.accessRuleSchema = accessRules.accessRuleSchema;
20
22
  exports.accessRuleApiPaths = accessRuleApiRoutes.accessRuleApiPaths;
21
23
  exports.getExpressApiRuleRateLimits = accessRuleApiRoutes.getExpressApiRuleRateLimits;
22
24
  exports.deleteAllRulesEndpointSchema = deleteAllRulesEndpoint.deleteAllRulesEndpointSchema;
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const mongooseRuleSchema = require("./mongooseRuleSchema.cjs");
4
+ exports.accessRuleMongooseSchema = mongooseRuleSchema.accessRuleMongooseSchema;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const userAttributesSchema = {
4
+ userId: { type: String, required: false },
5
+ ja4Hash: { type: String, required: false },
6
+ userAgent: { type: String, required: false },
7
+ headersHash: { type: String, required: false }
8
+ };
9
+ const userIpSchema = {
10
+ ip: { type: String, required: false },
11
+ ipMask: { type: String, required: false }
12
+ };
13
+ const userScopeSchema = {
14
+ ...userAttributesSchema,
15
+ ...userIpSchema
16
+ };
17
+ const policyScopeSchema = {
18
+ clientId: { type: String, required: false }
19
+ };
20
+ const accessPolicySchema = {
21
+ type: { type: String, required: true },
22
+ captchaType: { type: String, required: false },
23
+ description: { type: String, required: false },
24
+ solvedImagesCount: { type: Number, required: false },
25
+ imageThreshold: { type: Number, required: false },
26
+ powDifficulty: { type: Number, required: false },
27
+ unsolvedImagesCount: { type: Number, required: false },
28
+ frictionlessScore: { type: Number, required: false }
29
+ };
30
+ const accessRuleMongooseSchema = {
31
+ ...accessPolicySchema,
32
+ ...policyScopeSchema,
33
+ ...userScopeSchema,
34
+ ruleGroupId: { type: String, required: false }
35
+ };
36
+ exports.accessRuleMongooseSchema = accessRuleMongooseSchema;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const redisRulesStorage = require("./redisRulesStorage.cjs");
4
+ const redisRuleIndex = require("./redisRuleIndex.cjs");
5
+ exports.createRedisAccessRulesStorage = redisRulesStorage.createRedisAccessRulesStorage;
6
+ exports.accessRulesRedisIndex = redisRuleIndex.accessRulesRedisIndex;