Skip to content

Commit 7454a59

Browse files
fix: store all handshake details on the socket object
Related: #5
1 parent c4411f1 commit 7454a59

File tree

3 files changed

+30
-10
lines changed

3 files changed

+30
-10
lines changed

lib/server.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ export class Server extends EventEmitter<
235235

236236
return (socket.transport as Polling).onRequest(req, responseHeaders);
237237
} else {
238-
return this.handshake(req, server, responseHeaders);
238+
return this.handshake(req, server, url, responseHeaders);
239239
}
240240
}
241241

@@ -327,12 +327,14 @@ export class Server extends EventEmitter<
327327
*
328328
* @param req
329329
* @param server
330+
* @param url
330331
* @param responseHeaders
331332
* @private
332333
*/
333334
private async handshake(
334335
req: Request,
335336
server: Bun.Server<WebSocketData>,
337+
url: URL,
336338
responseHeaders: Headers,
337339
): Promise<Response> {
338340
const id = generateId();
@@ -362,7 +364,15 @@ export class Server extends EventEmitter<
362364

363365
debug(`new socket ${id}`);
364366

365-
const socket = new Socket(id, this.opts, transport, req);
367+
const socket = new Socket(id, this.opts, transport, {
368+
url: req.url,
369+
headers: Object.fromEntries(req.headers.entries()),
370+
_query: Object.fromEntries(url.searchParams.entries()),
371+
connection: {
372+
encrypted: ["https", "wss"].includes(url.protocol),
373+
},
374+
});
375+
366376
this.clients.set(id, socket);
367377

368378
socket.once("close", (reason) => {

lib/socket.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@ type ReadyState = "opening" | "open" | "closing" | "closed";
1010

1111
type UpgradeState = "not_upgraded" | "upgrading" | "upgraded";
1212

13+
// this is the format expected by the `socket.io` library
14+
// see https://github.com/socketio/socket.io/blob/cf6816afcff25c227b14ae6981e421bcad5af331/packages/socket.io/lib/socket.ts#L201-L215
15+
export interface HandshakeRequestReference {
16+
url: string;
17+
headers: Record<string, string>;
18+
_query: Record<string, string>;
19+
connection: {
20+
encrypted: boolean;
21+
};
22+
}
23+
1324
export type CloseReason =
1425
| "transport error"
1526
| "transport close"
@@ -40,7 +51,7 @@ export class Socket extends EventEmitter<
4051
public readonly id: string;
4152
public readyState: ReadyState = "opening";
4253
public transport: Transport;
43-
public readonly request;
54+
public readonly request: HandshakeRequestReference;
4455

4556
private readonly opts: ServerOptions;
4657
private upgradeState: UpgradeState = "not_upgraded";
@@ -55,7 +66,7 @@ export class Socket extends EventEmitter<
5566
id: string,
5667
opts: ServerOptions,
5768
transport: Transport,
58-
req: Request,
69+
req: HandshakeRequestReference,
5970
) {
6071
super();
6172

@@ -65,12 +76,7 @@ export class Socket extends EventEmitter<
6576
this.transport = transport;
6677
this.bindTransport(transport);
6778

68-
// we store the headers of the handshake request, so that they are available in the `socket.handshake` attribute in
69-
// the `socket.io` library
70-
this.request = {
71-
headers: Object.fromEntries(req.headers.entries()),
72-
connection: {},
73-
};
79+
this.request = req;
7480

7581
this.onOpen();
7682
}

test/socket.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ function setup() {
3838

3939
io.on("connection", (socket) => {
4040
expect(socket.handshake.headers).toContainKey("host");
41+
expect(socket.handshake.query.EIO).toEqual("4");
42+
expect(socket.handshake.url).toStartWith(
43+
"http://localhost:3001/socket.io/?EIO=4",
44+
);
4145

4246
socket.emit("auth", socket.handshake.auth);
4347

0 commit comments

Comments
 (0)