Skip to content

Commit 19c48a4

Browse files
refactor(sio): break circular dependency in source code
Related: #4329
1 parent 9b3c9ab commit 19c48a4

File tree

4 files changed

+114
-106
lines changed

4 files changed

+114
-106
lines changed

packages/socket.io/lib/broadcast-operator.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { BroadcastFlags, Room, SocketId } from "socket.io-adapter";
2-
import { Handshake, RESERVED_EVENTS, Socket } from "./socket";
2+
import { Handshake, RESERVED_EVENTS } from "./socket-types";
33
import { PacketType } from "socket.io-parser";
44
import type { Adapter } from "socket.io-adapter";
55
import type {
@@ -365,9 +365,8 @@ export class BroadcastOperator<EmitEvents extends EventsMap, SocketData>
365365
})
366366
.then((sockets) => {
367367
return sockets.map((socket) => {
368-
if (socket instanceof Socket) {
369-
// FIXME the TypeScript compiler complains about missing private properties
370-
return socket as unknown as RemoteSocket<EmitEvents, SocketData>;
368+
if (socket.server) {
369+
return socket as RemoteSocket<EmitEvents, SocketData>; // local instance
371370
} else {
372371
return new RemoteSocket(
373372
this.adapter,

packages/socket.io/lib/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ import {
2525
import * as parser from "socket.io-parser";
2626
import type { Encoder } from "socket.io-parser";
2727
import debugModule from "debug";
28-
import { Socket, DisconnectReason } from "./socket";
28+
import { Socket } from "./socket";
29+
import { DisconnectReason } from "./socket-types";
2930
import type { BroadcastOperator, RemoteSocket } from "./broadcast-operator";
3031
import {
3132
EventsMap,
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import type { NamespaceReservedEventsMap } from "./namespace";
2+
import type { IncomingHttpHeaders } from "http";
3+
import type { ParsedUrlQuery } from "querystring";
4+
5+
type ClientReservedEvents = "connect_error";
6+
7+
// TODO for next major release: cleanup disconnect reasons
8+
export type DisconnectReason =
9+
// Engine.IO close reasons
10+
| "transport error"
11+
| "transport close"
12+
| "forced close"
13+
| "ping timeout"
14+
| "parse error"
15+
// Socket.IO disconnect reasons
16+
| "server shutting down"
17+
| "forced server close"
18+
| "client namespace disconnect"
19+
| "server namespace disconnect";
20+
21+
export interface SocketReservedEventsMap {
22+
disconnect: (reason: DisconnectReason, description?: any) => void;
23+
disconnecting: (reason: DisconnectReason, description?: any) => void;
24+
error: (err: Error) => void;
25+
}
26+
27+
// EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener
28+
export interface EventEmitterReservedEventsMap {
29+
newListener: (
30+
eventName: string | Symbol,
31+
listener: (...args: any[]) => void,
32+
) => void;
33+
removeListener: (
34+
eventName: string | Symbol,
35+
listener: (...args: any[]) => void,
36+
) => void;
37+
}
38+
39+
export const RESERVED_EVENTS: ReadonlySet<string | Symbol> = new Set<
40+
| ClientReservedEvents
41+
| keyof NamespaceReservedEventsMap<never, never, never, never>
42+
| keyof SocketReservedEventsMap
43+
| keyof EventEmitterReservedEventsMap
44+
>(<const>[
45+
"connect",
46+
"connect_error",
47+
"disconnect",
48+
"disconnecting",
49+
"newListener",
50+
"removeListener",
51+
]);
52+
53+
/**
54+
* The handshake details
55+
*/
56+
export interface Handshake {
57+
/**
58+
* The headers sent as part of the handshake
59+
*/
60+
headers: IncomingHttpHeaders;
61+
62+
/**
63+
* The date of creation (as string)
64+
*/
65+
time: string;
66+
67+
/**
68+
* The ip of the client
69+
*/
70+
address: string;
71+
72+
/**
73+
* Whether the connection is cross-domain
74+
*/
75+
xdomain: boolean;
76+
77+
/**
78+
* Whether the connection is secure
79+
*/
80+
secure: boolean;
81+
82+
/**
83+
* The date of creation (as unix timestamp)
84+
*/
85+
issued: number;
86+
87+
/**
88+
* The request URL string
89+
*/
90+
url: string;
91+
92+
/**
93+
* The query object
94+
*/
95+
query: ParsedUrlQuery;
96+
97+
/**
98+
* The auth object
99+
*/
100+
auth: { [key: string]: any };
101+
}

packages/socket.io/lib/socket.ts

Lines changed: 8 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import {
1515
StrictEventEmitter,
1616
} from "./typed-events";
1717
import type { Client } from "./client";
18-
import type { Namespace, NamespaceReservedEventsMap } from "./namespace";
19-
import type { IncomingHttpHeaders, IncomingMessage } from "http";
18+
import type { Namespace } from "./namespace";
19+
import type { IncomingMessage } from "http";
2020
import type {
2121
Adapter,
2222
BroadcastFlags,
@@ -26,27 +26,16 @@ import type {
2626
SocketId,
2727
} from "socket.io-adapter";
2828
import base64id from "base64id";
29-
import type { ParsedUrlQuery } from "querystring";
3029
import { BroadcastOperator } from "./broadcast-operator";
30+
import {
31+
DisconnectReason,
32+
Handshake,
33+
RESERVED_EVENTS,
34+
SocketReservedEventsMap,
35+
} from "./socket-types";
3136

3237
const debug = debugModule("socket.io:socket");
3338

34-
type ClientReservedEvents = "connect_error";
35-
36-
// TODO for next major release: cleanup disconnect reasons
37-
export type DisconnectReason =
38-
// Engine.IO close reasons
39-
| "transport error"
40-
| "transport close"
41-
| "forced close"
42-
| "ping timeout"
43-
| "parse error"
44-
// Socket.IO disconnect reasons
45-
| "server shutting down"
46-
| "forced server close"
47-
| "client namespace disconnect"
48-
| "server namespace disconnect";
49-
5039
const RECOVERABLE_DISCONNECT_REASONS: ReadonlySet<DisconnectReason> = new Set([
5140
"transport error",
5241
"transport close",
@@ -56,88 +45,6 @@ const RECOVERABLE_DISCONNECT_REASONS: ReadonlySet<DisconnectReason> = new Set([
5645
"forced server close",
5746
]);
5847

59-
export interface SocketReservedEventsMap {
60-
disconnect: (reason: DisconnectReason, description?: any) => void;
61-
disconnecting: (reason: DisconnectReason, description?: any) => void;
62-
error: (err: Error) => void;
63-
}
64-
65-
// EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener
66-
export interface EventEmitterReservedEventsMap {
67-
newListener: (
68-
eventName: string | Symbol,
69-
listener: (...args: any[]) => void,
70-
) => void;
71-
removeListener: (
72-
eventName: string | Symbol,
73-
listener: (...args: any[]) => void,
74-
) => void;
75-
}
76-
77-
export const RESERVED_EVENTS: ReadonlySet<string | Symbol> = new Set<
78-
| ClientReservedEvents
79-
| keyof NamespaceReservedEventsMap<never, never, never, never>
80-
| keyof SocketReservedEventsMap
81-
| keyof EventEmitterReservedEventsMap
82-
>(<const>[
83-
"connect",
84-
"connect_error",
85-
"disconnect",
86-
"disconnecting",
87-
"newListener",
88-
"removeListener",
89-
]);
90-
91-
/**
92-
* The handshake details
93-
*/
94-
export interface Handshake {
95-
/**
96-
* The headers sent as part of the handshake
97-
*/
98-
headers: IncomingHttpHeaders;
99-
100-
/**
101-
* The date of creation (as string)
102-
*/
103-
time: string;
104-
105-
/**
106-
* The ip of the client
107-
*/
108-
address: string;
109-
110-
/**
111-
* Whether the connection is cross-domain
112-
*/
113-
xdomain: boolean;
114-
115-
/**
116-
* Whether the connection is secure
117-
*/
118-
secure: boolean;
119-
120-
/**
121-
* The date of creation (as unix timestamp)
122-
*/
123-
issued: number;
124-
125-
/**
126-
* The request URL string
127-
*/
128-
url: string;
129-
130-
/**
131-
* The query object
132-
*/
133-
query: ParsedUrlQuery;
134-
135-
/**
136-
* The auth object
137-
*/
138-
auth: { [key: string]: any };
139-
}
140-
14148
/**
14249
* `[eventName, ...args]`
14350
*/

0 commit comments

Comments
 (0)