Skip to content

Commit fe8730c

Browse files
authored
feat: add type information to socket.data (#4159)
Usage: ```js interface SocketData { name: string; age: number; } const io = new Server<ClientToServerEvents, ServerToClientEvents, InterServerEvents, SocketData>(); io.on("connection", (socket) => { socket.data.name = "john"; socket.data.age = 42; }); ```
1 parent ed8483d commit fe8730c

File tree

5 files changed

+84
-39
lines changed

5 files changed

+84
-39
lines changed

Diff for: lib/client.ts

+15-7
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,27 @@ interface WriteOptions {
2121
export class Client<
2222
ListenEvents extends EventsMap,
2323
EmitEvents extends EventsMap,
24-
ServerSideEvents extends EventsMap
24+
ServerSideEvents extends EventsMap,
25+
SocketData = any
2526
> {
2627
public readonly conn: RawSocket;
2728

2829
private readonly id: string;
29-
private readonly server: Server<ListenEvents, EmitEvents, ServerSideEvents>;
30+
private readonly server: Server<
31+
ListenEvents,
32+
EmitEvents,
33+
ServerSideEvents,
34+
SocketData
35+
>;
3036
private readonly encoder: Encoder;
3137
private readonly decoder: Decoder;
3238
private sockets: Map<
3339
SocketId,
34-
Socket<ListenEvents, EmitEvents, ServerSideEvents>
40+
Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
3541
> = new Map();
3642
private nsps: Map<
3743
string,
38-
Socket<ListenEvents, EmitEvents, ServerSideEvents>
44+
Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
3945
> = new Map();
4046
private connectTimeout?: NodeJS.Timeout;
4147

@@ -47,7 +53,7 @@ export class Client<
4753
* @package
4854
*/
4955
constructor(
50-
server: Server<ListenEvents, EmitEvents, ServerSideEvents>,
56+
server: Server<ListenEvents, EmitEvents, ServerSideEvents, SocketData>,
5157
conn: any
5258
) {
5359
this.server = server;
@@ -112,7 +118,7 @@ export class Client<
112118
auth,
113119
(
114120
dynamicNspName:
115-
| Namespace<ListenEvents, EmitEvents, ServerSideEvents>
121+
| Namespace<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
116122
| false
117123
) => {
118124
if (dynamicNspName) {
@@ -171,7 +177,9 @@ export class Client<
171177
*
172178
* @private
173179
*/
174-
_remove(socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>): void {
180+
_remove(
181+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
182+
): void {
175183
if (this.sockets.has(socket.id)) {
176184
const nsp = this.sockets.get(socket.id)!.nsp.name;
177185
this.sockets.delete(socket.id);

Diff for: lib/index.ts

+14-5
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,23 @@ interface ServerOptions extends EngineOptions, AttachOptions {
7272
export class Server<
7373
ListenEvents extends EventsMap = DefaultEventsMap,
7474
EmitEvents extends EventsMap = ListenEvents,
75-
ServerSideEvents extends EventsMap = DefaultEventsMap
75+
ServerSideEvents extends EventsMap = DefaultEventsMap,
76+
SocketData = any
7677
> extends StrictEventEmitter<
7778
ServerSideEvents,
7879
EmitEvents,
79-
ServerReservedEventsMap<ListenEvents, EmitEvents, ServerSideEvents>
80+
ServerReservedEventsMap<
81+
ListenEvents,
82+
EmitEvents,
83+
ServerSideEvents,
84+
SocketData
85+
>
8086
> {
8187
public readonly sockets: Namespace<
8288
ListenEvents,
8389
EmitEvents,
84-
ServerSideEvents
90+
ServerSideEvents,
91+
SocketData
8592
>;
8693
/**
8794
* A reference to the underlying Engine.IO server.
@@ -504,7 +511,9 @@ export class Server<
504511
*/
505512
public of(
506513
name: string | RegExp | ParentNspNameMatchFn,
507-
fn?: (socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>) => void
514+
fn?: (
515+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
516+
) => void
508517
): Namespace<ListenEvents, EmitEvents, ServerSideEvents> {
509518
if (typeof name === "function" || name instanceof RegExp) {
510519
const parentNsp = new ParentNamespace(this);
@@ -568,7 +577,7 @@ export class Server<
568577
*/
569578
public use(
570579
fn: (
571-
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>,
580+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>,
572581
next: (err?: ExtendedError) => void
573582
) => void
574583
): this {

Diff for: lib/namespace.ts

+35-17
Original file line numberDiff line numberDiff line change
@@ -21,56 +21,72 @@ export interface ExtendedError extends Error {
2121
export interface NamespaceReservedEventsMap<
2222
ListenEvents extends EventsMap,
2323
EmitEvents extends EventsMap,
24-
ServerSideEvents extends EventsMap
24+
ServerSideEvents extends EventsMap,
25+
SocketData
2526
> {
26-
connect: (socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>) => void;
27+
connect: (
28+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
29+
) => void;
2730
connection: (
28-
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>
31+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
2932
) => void;
3033
}
3134

3235
export interface ServerReservedEventsMap<
3336
ListenEvents,
3437
EmitEvents,
35-
ServerSideEvents
38+
ServerSideEvents,
39+
SocketData
3640
> extends NamespaceReservedEventsMap<
3741
ListenEvents,
3842
EmitEvents,
39-
ServerSideEvents
43+
ServerSideEvents,
44+
SocketData
4045
> {
4146
new_namespace: (
42-
namespace: Namespace<ListenEvents, EmitEvents, ServerSideEvents>
47+
namespace: Namespace<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
4348
) => void;
4449
}
4550

4651
export const RESERVED_EVENTS: ReadonlySet<string | Symbol> = new Set<
47-
keyof ServerReservedEventsMap<never, never, never>
52+
keyof ServerReservedEventsMap<never, never, never, never>
4853
>(<const>["connect", "connection", "new_namespace"]);
4954

5055
export class Namespace<
5156
ListenEvents extends EventsMap = DefaultEventsMap,
5257
EmitEvents extends EventsMap = ListenEvents,
53-
ServerSideEvents extends EventsMap = DefaultEventsMap
58+
ServerSideEvents extends EventsMap = DefaultEventsMap,
59+
SocketData = any
5460
> extends StrictEventEmitter<
5561
ServerSideEvents,
5662
EmitEvents,
57-
NamespaceReservedEventsMap<ListenEvents, EmitEvents, ServerSideEvents>
63+
NamespaceReservedEventsMap<
64+
ListenEvents,
65+
EmitEvents,
66+
ServerSideEvents,
67+
SocketData
68+
>
5869
> {
5970
public readonly name: string;
6071
public readonly sockets: Map<
6172
SocketId,
62-
Socket<ListenEvents, EmitEvents, ServerSideEvents>
73+
Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
6374
> = new Map();
6475

6576
public adapter: Adapter;
6677

6778
/** @private */
68-
readonly server: Server<ListenEvents, EmitEvents, ServerSideEvents>;
79+
readonly server: Server<
80+
ListenEvents,
81+
EmitEvents,
82+
ServerSideEvents,
83+
SocketData
84+
>;
6985

7086
/** @private */
7187
_fns: Array<
7288
(
73-
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>,
89+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>,
7490
next: (err?: ExtendedError) => void
7591
) => void
7692
> = [];
@@ -85,7 +101,7 @@ export class Namespace<
85101
* @param name
86102
*/
87103
constructor(
88-
server: Server<ListenEvents, EmitEvents, ServerSideEvents>,
104+
server: Server<ListenEvents, EmitEvents, ServerSideEvents, SocketData>,
89105
name: string
90106
) {
91107
super();
@@ -114,7 +130,7 @@ export class Namespace<
114130
*/
115131
public use(
116132
fn: (
117-
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>,
133+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>,
118134
next: (err?: ExtendedError) => void
119135
) => void
120136
): this {
@@ -130,7 +146,7 @@ export class Namespace<
130146
* @private
131147
*/
132148
private run(
133-
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>,
149+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>,
134150
fn: (err: ExtendedError | null) => void
135151
) {
136152
const fns = this._fns.slice(0);
@@ -195,7 +211,7 @@ export class Namespace<
195211
client: Client<ListenEvents, EmitEvents, ServerSideEvents>,
196212
query,
197213
fn?: () => void
198-
): Socket<ListenEvents, EmitEvents, ServerSideEvents> {
214+
): Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData> {
199215
debug("adding socket to nsp %s", this.name);
200216
const socket = new Socket(this, client, query);
201217
this.run(socket, (err) => {
@@ -238,7 +254,9 @@ export class Namespace<
238254
*
239255
* @private
240256
*/
241-
_remove(socket: Socket<ListenEvents, EmitEvents, ServerSideEvents>): void {
257+
_remove(
258+
socket: Socket<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
259+
): void {
242260
if (this.sockets.has(socket.id)) {
243261
this.sockets.delete(socket.id);
244262
} else {

Diff for: lib/parent-namespace.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ import type { BroadcastOptions } from "socket.io-adapter";
1111
export class ParentNamespace<
1212
ListenEvents extends EventsMap = DefaultEventsMap,
1313
EmitEvents extends EventsMap = ListenEvents,
14-
ServerSideEvents extends EventsMap = DefaultEventsMap
15-
> extends Namespace<ListenEvents, EmitEvents, ServerSideEvents> {
14+
ServerSideEvents extends EventsMap = DefaultEventsMap,
15+
SocketData = any
16+
> extends Namespace<ListenEvents, EmitEvents, ServerSideEvents, SocketData> {
1617
private static count: number = 0;
17-
private children: Set<Namespace<ListenEvents, EmitEvents, ServerSideEvents>> =
18-
new Set();
18+
private children: Set<
19+
Namespace<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
20+
> = new Set();
1921

20-
constructor(server: Server<ListenEvents, EmitEvents, ServerSideEvents>) {
22+
constructor(
23+
server: Server<ListenEvents, EmitEvents, ServerSideEvents, SocketData>
24+
) {
2125
super(server, "/_" + ParentNamespace.count++);
2226
}
2327

@@ -47,7 +51,7 @@ export class ParentNamespace<
4751

4852
createChild(
4953
name: string
50-
): Namespace<ListenEvents, EmitEvents, ServerSideEvents> {
54+
): Namespace<ListenEvents, EmitEvents, ServerSideEvents, SocketData> {
5155
const namespace = new Namespace(this.server, name);
5256
namespace._fns = this._fns.slice(0);
5357
this.listeners("connect").forEach((listener) =>

Diff for: lib/socket.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export interface EventEmitterReservedEventsMap {
4646

4747
export const RESERVED_EVENTS: ReadonlySet<string | Symbol> = new Set<
4848
| ClientReservedEvents
49-
| keyof NamespaceReservedEventsMap<never, never, never>
49+
| keyof NamespaceReservedEventsMap<never, never, never, never>
5050
| keyof SocketReservedEventsMap
5151
| keyof EventEmitterReservedEventsMap
5252
>(<const>[
@@ -113,7 +113,8 @@ type Event = [eventName: string, ...args: any[]];
113113
export class Socket<
114114
ListenEvents extends EventsMap = DefaultEventsMap,
115115
EmitEvents extends EventsMap = ListenEvents,
116-
ServerSideEvents extends EventsMap = DefaultEventsMap
116+
ServerSideEvents extends EventsMap = DefaultEventsMap,
117+
SocketData = any
117118
> extends StrictEventEmitter<
118119
ListenEvents,
119120
EmitEvents,
@@ -124,12 +125,17 @@ export class Socket<
124125
/**
125126
* Additional information that can be attached to the Socket instance and which will be used in the fetchSockets method
126127
*/
127-
public data: any = {};
128+
public data: Partial<SocketData> = {};
128129

129130
public connected: boolean;
130131
public disconnected: boolean;
131132

132-
private readonly server: Server<ListenEvents, EmitEvents, ServerSideEvents>;
133+
private readonly server: Server<
134+
ListenEvents,
135+
EmitEvents,
136+
ServerSideEvents,
137+
SocketData
138+
>;
133139
private readonly adapter: Adapter;
134140
private acks: Map<number, () => void> = new Map();
135141
private fns: Array<(event: Event, next: (err?: Error) => void) => void> = [];

0 commit comments

Comments
 (0)