-
Notifications
You must be signed in to change notification settings - Fork 30.4k
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
src: implement whatwg's URLPattern spec #56452
base: main
Are you sure you want to change the base?
Conversation
Review requested:
|
Can you elaborate? libuv is a C library so I don't think exceptions exist there, and I'm pretty sure V8 is built with exceptions disabled. |
My bad UV does not enable exceptions. Referencing v8.gyp file:
|
This is not really V8. It's a build-time executable (torque) used to generate code for V8 |
|
||
MaybeLocal<Value> URLPattern::Hash() const { | ||
auto context = env()->context(); | ||
return ToV8Value(context, url_pattern_.get_hash()); |
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 think the key challenge here is that this will copy the string on every call. Any chance of memoizing the string once created.
src/node_url_pattern.cc
Outdated
URLPattern::URLPattern(Environment* env, | ||
Local<Object> object, | ||
ada::url_pattern&& url_pattern) | ||
: BaseObject(env, object) { |
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.
We likely should introduce this as experimental in the first release, even if it graduates from experimental quickly. There should likely be a warning emitted on the first construction.
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.
AFAIK: There is no easy way to emit an experimental warning in C++ that can be dismissed using the CLI command. For now, I have made it experimental on the nodejs doc.
Can you also include a fairly simple benchmark? |
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #56452 +/- ##
==========================================
- Coverage 89.16% 88.71% -0.45%
==========================================
Files 661 664 +3
Lines 191421 192638 +1217
Branches 36845 36770 -75
==========================================
+ Hits 170673 170905 +232
- Misses 13615 14482 +867
- Partials 7133 7251 +118
|
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 don’t think this is a good pattern to land in Node.js. Specifically, a server using this will create one per route and iterate in a loop. This will be slow, specifically if you need to match the last of the list.
(This feedback was provided when URLPattern was standardized and essentially ignored).
For this to be useful, we would need to have a Node.js-specific API to organize these URLPattern in a radix prefix trie and actually do the matching all at once.
I can possibly be persuaded that we need this for Web platform compatibility, but it’s not that popular either (unlike fetch()).
@jasnell I’ll try to build this and get a benchmark going against the ecosystem routers. |
Right now, this pull-request does not pass WPT, and not at all optimized. Any benchmarks will not be beneficial. |
981efd1
to
b514115
Compare
} | ||
|
||
void URLPattern::MemoryInfo(MemoryTracker* tracker) const { | ||
// TODO(anonrig): Implement 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.
Don't forget 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.
I'm not sure how to properly set the memory of a url_pattern. Any suggestions?
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.
Just estimate, it does not need to be exact. This information is used when generating a heap snapshot so it's largely informational.
Local<Value> ignore_case; | ||
if (obj->Get(env->context(), | ||
FIXED_ONE_BYTE_STRING(env->isolate(), "ignoreCase")) | ||
.ToLocal(&ignore_case)) { |
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.
Handle the ToLocal(...) == false case properly ;-)
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.
if it can't get it, we should fail since it is not required. I think this is unnecessary.
return; | ||
} | ||
info.GetReturnValue().Set(result); | ||
} |
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 way these are defined, the property is going to be reserialized as a new string on every call. Should probably memoize these to avoid the extraneous/duplicative copies.
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.
Any suggestions on how to memoize with least amount of code and highest amount of memory safety possible?
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.
You would need to have v8::Global<v8::String>
member fields to cache the values. Or, maybe use SetLazyDataProperty()
... not sure if the latter would make it spec compliant, tho, as I believe it makes the properties instance properties rather than prototype properties.
055fefc
to
201bf3c
Compare
@nodejs/tsc @nodejs/build @nodejs/platform-macos I can not land this pull-request due to the old macOS infrastructure. This is currently the only blocker for this pull-request.
|
What's the status with WPTs? |
} | ||
return Null(env->isolate()); | ||
} | ||
env->ThrowTypeError("Failed to exec URLPattern"); |
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.
These throws (here and the "Failed to test ..." one below) need proper error codes.
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.
Any suggestion on error code naming?
There is currently 19 failing tests, and 8 of them are invalid, and needs to be fixed in WPT. I have an open PR: web-platform-tests/wpt#49782
Not at the moment. My goal is to pass almost all WPT and land this pull-request before optimizing it. Passing all WPT will give us the confidence to optimize more aggressively. |
201bf3c
to
77419ea
Compare
Co-authored-by: Daniel Lemire <[email protected]>
77419ea
to
2a19d32
Compare
Co-authored-by: Daniel Lemire (@lemire)
Blocked
This is blocked from landing due to the old macOS machines we use in our infrastructure (cc @nodejs/build)
Notes:
TODOs
cc @nodejs/cpp-reviewers
Fixes #40844