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

Option to use fetch instead of XMLHttpRequest for polling #716

Closed
matthiasgeihs opened this issue Dec 11, 2023 · 4 comments
Closed

Option to use fetch instead of XMLHttpRequest for polling #716

matthiasgeihs opened this issue Dec 11, 2023 · 4 comments
Labels
enhancement New feature or request
Milestone

Comments

@matthiasgeihs
Copy link

Is your feature request related to a problem? Please describe.
Some environments don't support XMLHttpRequest, but support fetch.
(e.g., MetaMask Snaps)

Describe the solution you'd like
It would be great if there was an option for using fetch instead XMLHttpRequest.

Describe alternatives you've considered
There seems to be a way to solve this problem via a postinstall patch (as described in the article linked above), but native support would be favored.

@matthiasgeihs matthiasgeihs added the enhancement New feature or request label Dec 11, 2023
@zhengcling
Copy link

I also have this need currently.

@darrachequesne
Copy link
Member

We could indeed let the user overrides the list of available low-level transports. Not sure how it could work with tree-shaking though.

darrachequesne added a commit that referenced this issue Apr 23, 2024
Usage:

```js
import { Socket, transports, Fetch } from "engine.io-client";

transports.polling = Fetch;

const socket = new Socket("https://example.com");
```

Note: tree-shaking unused transports is not currently supported and
will be added later.

Related:

- socketio/socket.io#4980
- #716
darrachequesne added a commit that referenced this issue May 31, 2024
This commit adds the ability to provide a list of transport
implementations to use when connecting to an Engine.IO server.

This can be used to use HTTP long-polling based on `fetch()`, instead
of the default implementation based on the `XMLHttpRequest` object.

```
import { Socket, Fetch, WebSocket } from "engine.io-client";

const socket = new Socket({
  transports: [Fetch, WebSocket]
});
```

This is useful in some environments that do not provide a
`XMLHttpRequest` object, like Chrome extension background scripts.

> XMLHttpRequest() can't be called from a service worker, extension or
otherwise. Replace calls from your background script to
XMLHttpRequest() with calls to global fetch().

Source: https://developer.chrome.com/docs/extensions/develop/migrate/to-service-workers#replace-xmlhttprequest

Related:

- #716
- socketio/socket.io#4980

This is also useful when running the client with Deno or Bun, as it
allows to use the built-in `fetch()` method and `WebSocket` object,
instead of using the `xmlhttprequest-ssl` and `ws` Node.js packages.

Related: socketio/socket.io-deno#12

This feature also comes with the ability to exclude the code related to
unused transports (a.k.a. "tree-shaking"):

```js
import { SocketWithoutUpgrade, WebSocket } from "engine.io-client";

const socket = new SocketWithoutUpgrade({
  transports: [WebSocket]
});
```

In that case, the code related to HTTP long-polling and WebTransport
will be excluded from the final bundle.

Related: socketio/socket.io#4393
@darrachequesne
Copy link
Member

You can now use fetch() instead of XMLHttpRequest:

import { Socket, Fetch, WebSocket } from "engine.io-client";

const socket = new Socket({
  transports: [Fetch, WebSocket]
});

Included in version 6.6.0.

@darrachequesne darrachequesne added this to the 6.6.0 milestone Jun 24, 2024
@matthiasgeihs
Copy link
Author

Very nice!

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

No branches or pull requests

3 participants