The undefined value breaks React Native on Android with a rather cryptic error message:
```
Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue() on a null object reference
```
This bug was introduced by [1].
[1]: 5f47a50ee5
Related: https://github.com/socketio/socket.io-client/issues/1403
Only 'headers' and 'localAddress' options are supported by the
WebSocket implementation in React Native.
The following message was printed to the console:
> Unrecognized WebSocket connection option(s) `agent`, `perMessageDeflate`, `pfx`, `key`, `passphrase`, `cert`, `ca`, `ciphers`, `rejectUnauthorized`. Did you mean to put these under `headers`?
Reference: https://reactnative.dev/docs/network.html#websocket-support
The ping packets will now be sent by the server, because the timers set
in the browsers are not reliable enough. We suspect that a lot of
timeout problems came from timers being delayed on the client-side.
Breaking change: v3.x clients will not be able to connect anymore (they
will send a ping packet and timeout while waiting for a pong packet).
Related: https://github.com/socketio/engine.io/issues/312
React-Native provides a Websocket object that is more functionally aligned with the Node.js websocket than the browser websocket.
It has the same constructor signature as the Node.js websocket and can support extraHeaders and protocols.
This PR will detect when the engine.io-client is running in React-Native, call the proper Websocket constructor, and enable support for extraHeaders.
This allows browser loaders like StealJS to load this package without showing any errors or warnings in the console (since you the only way to check if a file exists from the browser it to request it, node-style folder assumptions can't be made without potential 404s.)
The package works fine with the StealJS build tools, since they're node based, but this lets allows it to work with the browser version.
This fixes an issue when a full url is specified (i.e.
http://service.com) the port would be the port from the page and not the
uri string. This is easily exposed if using external engine.io servers
on a page served up by localhost:3000 or similar from a development
page.