Skip to content

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

Merged
watson merged 3 commits intoothiym23:masterfrom
sabakugaara:fix-node8-net-connect
Dec 21, 2017
Merged

fix: wrap net.connect failed in node.js 8+#129
watson merged 3 commits intoothiym23:masterfrom
sabakugaara:fix-node8-net-connect

Conversation

@sabakugaara
Copy link
Copy Markdown
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
Copy Markdown
Contributor Author

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

@sabakugaara
Copy link
Copy Markdown
Contributor Author

sabakugaara commented Dec 2, 2017

related PR: #110

@watson
Copy link
Copy Markdown
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
Copy Markdown
Contributor Author

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

Comment thread index.js Outdated
wrap(net.Socket.prototype, 'connect', function (original) {
return function () {
var args;
if (v8plus && Array.isArray(arguments[0])) {
Copy link
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
Contributor Author

Thanks @watson , I've updated the code.

@sabakugaara
Copy link
Copy Markdown
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