Skip to content
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

fix: wrap net.connect failed in node.js 8+ #129

Merged
merged 3 commits into from
Dec 21, 2017

Conversation

sabakugaara
Copy link
Contributor

in node8.0+, Socket.prototype.connect arguments has been normalized in net.connect call.

This will fix node-continuation-local-storage test broken.

possible related issue: othiym23/node-continuation-local-storage#117

@sabakugaara
Copy link
Contributor Author

ci failed, I looked test/http-request.tap.js, but I have no idea now.

@sabakugaara
Copy link
Contributor Author

sabakugaara commented Dec 2, 2017

related PR: #110

@watson
Copy link
Collaborator

watson commented Dec 3, 2017

@sabakugaara Thanks for taking the time to look into this 😃 Unless someone else have time, I'll try and take a look within the next few days when I'm back home

@sabakugaara
Copy link
Contributor Author

Hi @watson, I update the test case, CI has been passed now.

index.js Outdated
@@ -105,10 +106,16 @@ function patchOnRead(ctx) {

wrap(net.Socket.prototype, 'connect', function (original) {
return function () {
var args;
if (v8plus && Array.isArray(arguments[0])) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's the related code in Node 8:

https://github.com/nodejs/node/blob/0d8021e5a4cf0a6aa3a700a361f6d42c2894f2ba/lib/net.js#L943-L951

As you can see Node core uses an internal symbol referenced by normalizedArgsSymbol (which we don't have access to) as an extra guard in case someone actually by a error passes in an array as the first argument. First I thought we couldn't check for at as the normalizedArgsSymbol symbol isn't available to us, but I just realized that we could add a check for if there's a symbol or not - which might be better than nothing:

if (v8plus && Array.isArray(arguments[0]) && Object.getOwnPropertySymbols(arguments[0]).length > 0) {

We could also go all the way to to a string comparison, but I feel that's way too dirty:

Object.getOwnPropertySymbols(arguments[0]).toString() === 'Symbol(normalizedArgs)'

I could also be fine with just merging the PR as is. But I just wanted to follow this train of thoughts 😅

@Qard what do you think?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it might have Symbol.iterator on it, so just checking for presence of any symbols probably won't be helpful. We can probably just drop that check and just go by if it's an array.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so, just keep it the same as this is acceptable?

if(v8plus && Array.isArray(arguments[0])) {

Copy link
Collaborator

@watson watson Dec 21, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A normal array will not have a Symbol, so this should still guard against that case. So I think I'll merge this PR in as is and then add a comment about the Symbol gotcha next to the if-sentence. Thanks for the patience 😄

@sabakugaara
Copy link
Contributor Author

Thanks @watson , I've updated the code.

@sabakugaara
Copy link
Contributor Author

Do I need to update anything more?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants