-
Notifications
You must be signed in to change notification settings - Fork 312
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add limits to the number of router rule registration #1752
base: main
Are you sure you want to change the base?
Conversation
b0af1d0
to
f427b1a
Compare
1. If |result|'s [=count router condition result/depth=] exceeds |maxDepth|, return |result|. | ||
1. If |condition|["{{RouterCondition/_or}}"] [=map/exists=], then: | ||
1. Increment |result|'s [=count router condition result/depth=] by one. | ||
1. For each |orCondition| of |condition|["{{RouterCondition/_or}}"]: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I feel that the number of conditions under |orCondition| may not be counted?
e.g.
or: [{singleRule}, {singleRule}, {singleRule}]
|result| might be overwritten by the result for {singleRule} for three times, but we want |result|'s [=total count=] to be three.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe those are correctly counted? Let's walk through the current algorithm. btw, under the current design, or: [{singleRule}, {singleRule}, {singleRule}]
, this total count is expected to be four (or
should be counted as one condition).
- We call count-router-inner-conditions with the root
or
condition. The total count will be one. - Starts the for loop with the first {singleRule}.
- In the first sub-step, |result|'s
total count
will be two, because we pass "one" astotal count
to count-router-inner-conditions in this sub-step.total count
will be incremented inside the algorithm. - The second {singleRule} is handled.
total count
will be three. - The third {singleRule} is handled.
total count
will be four.
Am I missing something?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Upon the sync, I understand how this works.
The last result will be the |currentResult|'s total count, and it will be passed to the coming count-router-inner-conditions. Therefore, the value will be updated like:
- |currentResult| is passed to count-router-inner-conditions's argument
- in the count-router-inner-conditions, the given argument will be updated
- the updated value will be returned
- |currentResult|'s total count will be set to the returned result's total count.
Therefore, even if the algorithm does not have add x + y like operation, the count will be updated.
I feel the data flow is difficult to track at once, and hope some notes to explain that as you have already noted below.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've updated to set |result| to be the result of count-router-inner-conditions directly, and now we don't have to set total count
explicitly. Hence note is not required anymore. WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe?
After reviewing this, I got familiar with the algorithm well and can easily read this like so.
However, I am not sure how people first look feel on this. Let me delegate the decision to other reviewers on this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The algorithm seems pretty intuitive to me now without needing a note. It is clear that result is mutated and the for-loop over all _or
conditions means it will be mutated once for each sub-condition.
…rithms not to pass maxCount and maxDepth
Sorry for the recent update, but will you resolve the conflicts? |
Done |
Thank you. lgtm. |
@youennf @asutherland @domenic Will you take a look at the PR? |
Let me wait for a few days to gather thoughts from who joined #1746 before merge. |
1. If |result|'s [=count router condition result/depth=] exceeds |maxDepth|, return |result|. | ||
1. If |condition|["{{RouterCondition/_or}}"] [=map/exists=], then: | ||
1. Increment |result|'s [=count router condition result/depth=] by one. | ||
1. For each |orCondition| of |condition|["{{RouterCondition/_or}}"]: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The algorithm seems pretty intuitive to me now without needing a note. It is clear that result is mutated and the for-loop over all _or
conditions means it will be mutated once for each sub-condition.
Co-authored-by: Domenic Denicola <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you!
In #1746, we discussed if the spec should give guidelines about the limit of added routes, and how the user agent should behave if the added routes exceeds the limit.
We have an agreement that we're willing to pick some specific limits. This PR proposes 1024 as the total number of router conditions, and 10 as the max depth of router condition nesting level. If it exceeds those limits, the user agent throws a TypeError.
For the counting conditions part, let me clarify how we calculate the total count as this a bit tricky.
Assuming that router conditions can be nested by using
or
andnot
syntaxes. We count every sub router conditions inside the parentor
ornot
condition, including the parent condition itself.Here are some examples.
#1714 will be migrated into this PR.
Preview | Diff