force ipv4 for prebuild requests #194
Open
+1
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
force ipv4 for prebuild request due to simple-get request timeout when encountering broken ipv6 routers
The underlying issue is that when dns resolves to multiple IPs all ips are attempted. ipv6 is tried first, then ipv4. This behavior is known as Happy Eyeballs. https://en.wikipedia.org/wiki/Happy_Eyeballs
For every ip failure, it will emit a timeout event which simple-get interprets as an error and terminate the request (which is still attempting other ips).
https://github.com/feross/simple-get/blob/e7a74115ca9dd28720f186275c5a67df81985426/index.js#L75
Specifically, disabling/ignoring this ipv6 timeout event in simple-get allows the request to succeed on ipv4, and prebuild-install completes successfully.
This timeout event handling may be a bug in either node (since the entire request hasnt timed out, just 1 ip attempt), or a bug in simple-get where it should be more discerning about which request timeout events it should observe. In any case, this is an issue with an end user machines ipv6 network configuration. Expecting binaries be hosted on a ipv4 resolvable address seems reasonable, so that prebuilds have a happy path for successful install. Otherwise it can fall back to host build.
https://nodejs.org/api/net.html#netgetdefaultautoselectfamily