Comments (3)
Hi!
That's an... interesting behavior, thanks for the detailed analysis. Do you have a suggestion for how to fix this?
from engine.io.
I can't confidently suggest a fix without a deeper understanding of why engine.io uses yeast, which creates the sid
based on the timestamp (or seeded by the timestamp). engine.io server and client do not seem to actually need to decode that timestamp and it's only for cache busting. I think yeast is unnecessary here.
Here's my understanding:
https://stackoverflow.com/questions/48633145/what-is-the-t-query-parameter-in-a-socket-io-handshake
Here's the yeast implementation:
https://github.com/unshiftio/yeast/blob/443a08ea08a10133b6f8a9db536b0d6e52c6bfe1/index.js#L51
My take is that this is not ideal. yeast will generate guaranteed unique values within a single js context, but not within multiple js contexts like my issue, multiple iframes loading all at once and timestamp lucking into the same sid
. Addressing this means some sort of pseudorandom value should also be used.
I'd replace yeast altogether with something like:
// yeast-replacement.ts
// guarantee unique within a single js context, like yeast
let suffixUnique = 0;
// probably unique within multiple js contexts
const jsUnique = Math.random().toString(36).replace('.', '');
export function generateId() {
// time based cache bust, like yeast
const timeUnique = Date.now().toString(36);
return timeUnique + jsUnique + (suffixUnique++).toString();
}
Or continue using yeast, and append a one time created jsUnique to every yeast generated id. That's probably the best approach.
from engine.io.
The format of the query parameter has been updated: socketio/engine.io-client@b624c50 (included in version 6.6.0).
It now uses:
export function randomString() {
return (
Date.now().toString(36).substring(3) +
Math.random().toString(36).substring(2, 5)
);
}
Thanks!
from engine.io.
Related Issues (20)
- Customize response headers with Express middleware HOT 6
- Possible error in websocket code HOT 2
- clientsCount property of server... why need to keep this private, HOT 1
- In package.json, move @types/* from dependencies to devDependencies HOT 9
- Log with pino-http middleware raises TypeError: res.on is not a function HOT 1
- Latest uWs not working HOT 5
- ReferenceError: TextDecoder is not defined HOT 5
- Getting unexpected messages from some clients HOT 2
- Node.js versions below 10.2 are not compatible with the latest version 6.5.1. HOT 1
- WebTransport If the length of the data block exceeds maxDatagramSize, the server will be unable to receive the complete message (the client will not send the complete message). HOT 2
- Upgrading from polling to webtransport will report engine invalid WebTransport handshake. HOT 8
- Add support for Node.js built-in WebSocket? HOT 7
- Upgrade 6.5.2 but the error of uWebsocket aborted write failed still appear HOT 1
- Add new transport: gRPC-Web HOT 2
- HTTP/2 Web Socket in Chrome not working HOT 2
- Send callback may not be called if message is sent during upgrade window HOT 2
- Cannot set `socket.request` to `null` because the property is read-only HOT 2
- `websocket`: `send` callbacks are not all called if multiple messages are sent rapidly HOT 1
- Error with uWebSockets.js: uWS.HttpResponse must not be accessed after uWS.HttpResponse.onAborted callback
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from engine.io.