@prosopo/user-access-policy 3.12.28 → 3.12.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build$colon$cjs.log +8 -8
- package/.turbo/turbo-build$colon$tsc.log +14 -14
- package/.turbo/turbo-build.log +8 -8
- package/CHANGELOG.md +16 -0
- package/dist/cjs/redis/reader/redisRulesQuery.cjs +3 -1
- package/dist/cjs/redis/reader/redisRulesReader.cjs +4 -1
- package/dist/cjs/redis/reader/redisRulesSplitQuery.cjs +31 -5
- package/dist/cjs/redis/redisRuleIndex.cjs +4 -0
- package/dist/cjs/ruleInput/ruleInput.cjs +2 -1
- package/dist/redis/reader/redisRulesQuery.d.ts +1 -0
- package/dist/redis/reader/redisRulesQuery.d.ts.map +1 -1
- package/dist/redis/reader/redisRulesQuery.js +3 -2
- package/dist/redis/reader/redisRulesQuery.js.map +1 -1
- package/dist/redis/reader/redisRulesReader.d.ts.map +1 -1
- package/dist/redis/reader/redisRulesReader.js +4 -1
- package/dist/redis/reader/redisRulesReader.js.map +1 -1
- package/dist/redis/reader/redisRulesSplitQuery.d.ts +1 -0
- package/dist/redis/reader/redisRulesSplitQuery.d.ts.map +1 -1
- package/dist/redis/reader/redisRulesSplitQuery.js +32 -6
- package/dist/redis/reader/redisRulesSplitQuery.js.map +1 -1
- package/dist/redis/redisRuleIndex.d.ts.map +1 -1
- package/dist/redis/redisRuleIndex.js +4 -0
- package/dist/redis/redisRuleIndex.js.map +1 -1
- package/dist/ruleInput/ruleInput.d.ts +3 -0
- package/dist/ruleInput/ruleInput.d.ts.map +1 -1
- package/dist/ruleInput/ruleInput.js +2 -1
- package/dist/ruleInput/ruleInput.js.map +1 -1
- package/dist/rulesStorage.d.ts +1 -0
- package/dist/rulesStorage.d.ts.map +1 -1
- package/dist/tests/blockingRuleShapes.unit.test.d.ts +2 -0
- package/dist/tests/blockingRuleShapes.unit.test.d.ts.map +1 -0
- package/dist/tests/blockingRuleShapes.unit.test.js +176 -0
- package/dist/tests/blockingRuleShapes.unit.test.js.map +1 -0
- package/dist/tests/redis/deferredPoolClause.benchmark.d.ts +2 -0
- package/dist/tests/redis/deferredPoolClause.benchmark.d.ts.map +1 -0
- package/dist/tests/redis/deferredPoolClause.benchmark.js +175 -0
- package/dist/tests/redis/deferredPoolClause.benchmark.js.map +1 -0
- package/dist/tests/redis/reader/redisRulesSplitQuery.unit.test.js +33 -0
- package/dist/tests/redis/reader/redisRulesSplitQuery.unit.test.js.map +1 -1
- package/package.json +3 -3
- package/src/redis/reader/redisRulesQuery.ts +24 -1
- package/src/redis/reader/redisRulesReader.ts +1 -0
- package/src/redis/reader/redisRulesSplitQuery.ts +51 -14
- package/src/redis/redisRuleIndex.ts +7 -0
- package/src/ruleInput/ruleInput.ts +1 -0
- package/src/rulesStorage.ts +9 -0
- package/src/tests/blockingRuleShapes.unit.test.ts +244 -0
- package/src/tests/redis/deferredPoolClause.benchmark.ts +249 -0
- package/src/tests/redis/reader/redisRulesSplitQuery.unit.test.ts +73 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -162,6 +162,79 @@ describe("buildScopedRulesSubQueries", () => {
|
|
|
162
162
|
}
|
|
163
163
|
});
|
|
164
164
|
|
|
165
|
+
it("emits a separate probe set for deferred rules at verify", () => {
|
|
166
|
+
// Two disjoint pools, each with its own
|
|
167
|
+
// SPLIT_MAX_CANDIDATES_PER_SUB budget, so a dense deferred cohort
|
|
168
|
+
// cannot truncate hard blocks out of the candidate set.
|
|
169
|
+
const subs = buildScopedRulesSubQueries(
|
|
170
|
+
{ numericIp: 1376899398n },
|
|
171
|
+
"clientA",
|
|
172
|
+
{ blockOnly: true, includeDeferred: true },
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
const block = subs.filter((s) => s.kind.startsWith("block:"));
|
|
176
|
+
const deferred = subs.filter((s) => s.kind.startsWith("deferred:"));
|
|
177
|
+
|
|
178
|
+
expect(block.length).toBeGreaterThan(0);
|
|
179
|
+
expect(deferred.length).toBe(block.length);
|
|
180
|
+
|
|
181
|
+
// Hard-block probes exclude deferred rules...
|
|
182
|
+
for (const sub of block) {
|
|
183
|
+
expect(sub.query).toContain("@type:{block} -@deferToVerify:{true}");
|
|
184
|
+
}
|
|
185
|
+
// ...and the deferred probes carry no type constraint, so a
|
|
186
|
+
// deferred Restrict is fetched at verify.
|
|
187
|
+
for (const sub of deferred) {
|
|
188
|
+
expect(sub.query).toContain("@deferToVerify:{true}");
|
|
189
|
+
expect(sub.query).not.toContain("@type:{block}");
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("never merges the two pools into one probe", () => {
|
|
194
|
+
// A merged `(@type:{block} | @deferToVerify:{true})` probe shares
|
|
195
|
+
// one candidate budget between both populations — measured at 800
|
|
196
|
+
// candidates against a cap of 500 on a concentrated scope.
|
|
197
|
+
const subs = buildScopedRulesSubQueries(
|
|
198
|
+
{ numericIp: 1376899398n },
|
|
199
|
+
"clientA",
|
|
200
|
+
{ blockOnly: true, includeDeferred: true },
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
for (const sub of subs) {
|
|
204
|
+
expect(sub.query).not.toContain("| @deferToVerify:{true}");
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("excludes deferred rules from the request-time pool", () => {
|
|
209
|
+
// blockOnly without includeDeferred is the middleware. Deferred
|
|
210
|
+
// rules are never enforceable there, so they are filtered out in
|
|
211
|
+
// Redis rather than fetched and discarded in JS.
|
|
212
|
+
const subs = buildScopedRulesSubQueries(
|
|
213
|
+
{ numericIp: 1376899398n },
|
|
214
|
+
"clientA",
|
|
215
|
+
{ blockOnly: true },
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
for (const sub of subs) {
|
|
219
|
+
expect(sub.query).toContain("-@deferToVerify:{true}");
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it("ignores includeDeferred when blockOnly is not set", () => {
|
|
224
|
+
// Without blockOnly there is no type clause to narrow; every rule
|
|
225
|
+
// type is already in the pool.
|
|
226
|
+
const subs = buildScopedRulesSubQueries(
|
|
227
|
+
{ numericIp: 1376899398n },
|
|
228
|
+
"clientA",
|
|
229
|
+
{ includeDeferred: true },
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
for (const sub of subs) {
|
|
233
|
+
expect(sub.query).not.toContain("@deferToVerify");
|
|
234
|
+
expect(sub.query).not.toContain("@type:{block}");
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
|
|
165
238
|
it("emits the same probe kinds regardless of blockOnly", () => {
|
|
166
239
|
// The probe set is driven by populated request scope, not by
|
|
167
240
|
// rule-type filter. blockOnly only narrows what each probe
|