Skip to content

Commit dc381b7

Browse files
perf: add support for the "wsPreEncoded" writing option
Packets that are sent to multiple clients will now be pre-encoded for the WebSocket transport (which means simply prepending "4" - which is the "message" packet type in Engine.IO). Note: buffers are not pre-encoded, since they are sent without modification over the WebSocket connection See also: socketio/engine.io@7706b12 engine.io diff: socketio/engine.io@5.0.0...5.1.0
1 parent 9fff034 commit dc381b7

File tree

4 files changed

+55
-30
lines changed

4 files changed

+55
-30
lines changed

lib/client.ts

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ import type { SocketId } from "socket.io-adapter";
1010

1111
const debug = debugModule("socket.io:client");
1212

13+
interface WriteOptions {
14+
compress?: boolean;
15+
volatile?: boolean;
16+
wsPreEncoded?: string;
17+
}
18+
1319
export class Client<
1420
ListenEvents extends EventsMap,
1521
EmitEvents extends EventsMap
@@ -180,31 +186,28 @@ export class Client<
180186
* @param {Object} opts
181187
* @private
182188
*/
183-
_packet(packet: Packet, opts?: any): void {
184-
opts = opts || {};
185-
const self = this;
186-
187-
// this writes to the actual connection
188-
function writeToEngine(encodedPackets: any) {
189-
// TODO clarify this.
190-
if (opts.volatile && !self.conn.transport.writable) return;
191-
for (let i = 0; i < encodedPackets.length; i++) {
192-
self.conn.write(encodedPackets[i], { compress: opts.compress });
193-
}
189+
_packet(packet: Packet, opts: WriteOptions = {}): void {
190+
if (this.conn.readyState !== "open") {
191+
debug("ignoring packet write %j", packet);
192+
return;
193+
}
194+
const encodedPackets = this.encoder.encode(packet);
195+
for (const encodedPacket of encodedPackets) {
196+
this.writeToEngine(encodedPacket, opts);
194197
}
198+
}
195199

196-
if ("open" === this.conn.readyState) {
197-
debug("writing packet %j", packet);
198-
if (!opts.preEncoded) {
199-
// not broadcasting, need to encode
200-
writeToEngine(this.encoder.encode(packet)); // encode, then write results to engine
201-
} else {
202-
// a broadcast pre-encodes a packet
203-
writeToEngine(packet);
204-
}
205-
} else {
206-
debug("ignoring packet write %j", packet);
200+
private writeToEngine(
201+
encodedPacket: String | Buffer,
202+
opts: WriteOptions
203+
): void {
204+
if (opts.volatile && !this.conn.transport.writable) {
205+
debug(
206+
"volatile packet is discarded since the transport is not currently writable"
207+
);
208+
return;
207209
}
210+
this.conn.write(encodedPacket, opts);
208211
}
209212

210213
/**

package-lock.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@
5151
"accepts": "~1.3.4",
5252
"base64id": "~2.0.0",
5353
"debug": "~4.3.1",
54-
"engine.io": "~5.0.0",
55-
"socket.io-adapter": "~2.2.0",
54+
"engine.io": "~5.1.0",
55+
"socket.io-adapter": "~2.3.0",
5656
"socket.io-parser": "~4.0.3"
5757
},
5858
"devDependencies": {

test/socket.io.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2385,6 +2385,28 @@ describe("socket.io", () => {
23852385
});
23862386
});
23872387
});
2388+
2389+
it("should pre encode a broadcast packet", (done) => {
2390+
const srv = createServer();
2391+
const sio = new Server(srv);
2392+
2393+
srv.listen(() => {
2394+
const clientSocket = client(srv, { multiplex: false });
2395+
2396+
sio.on("connection", (socket) => {
2397+
socket.conn.on("packetCreate", (packet) => {
2398+
expect(packet.data).to.eql('2["hello","world"]');
2399+
expect(packet.options.wsPreEncoded).to.eql('42["hello","world"]');
2400+
2401+
clientSocket.close();
2402+
sio.close();
2403+
done();
2404+
});
2405+
2406+
sio.emit("hello", "world");
2407+
});
2408+
});
2409+
});
23882410
});
23892411

23902412
describe("middleware", () => {

0 commit comments

Comments
 (0)