Skip to content

Commit 770ee59

Browse files
authoredJan 6, 2022
fix(types): make RemoteSocket.data type safe (#4234)
Related: - #4229 - fe8730c
1 parent 3bf5d92 commit 770ee59

File tree

5 files changed

+60
-38
lines changed

5 files changed

+60
-38
lines changed
 

‎lib/broadcast-operator.ts

+25-16
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import type {
99
TypedEventBroadcaster,
1010
} from "./typed-events";
1111

12-
export class BroadcastOperator<EmitEvents extends EventsMap>
12+
export class BroadcastOperator<EmitEvents extends EventsMap, SocketData>
1313
implements TypedEventBroadcaster<EmitEvents>
1414
{
1515
constructor(
@@ -26,7 +26,7 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
2626
* @return a new BroadcastOperator instance
2727
* @public
2828
*/
29-
public to(room: Room | Room[]): BroadcastOperator<EmitEvents> {
29+
public to(room: Room | Room[]): BroadcastOperator<EmitEvents, SocketData> {
3030
const rooms = new Set(this.rooms);
3131
if (Array.isArray(room)) {
3232
room.forEach((r) => rooms.add(r));
@@ -48,7 +48,7 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
4848
* @return a new BroadcastOperator instance
4949
* @public
5050
*/
51-
public in(room: Room | Room[]): BroadcastOperator<EmitEvents> {
51+
public in(room: Room | Room[]): BroadcastOperator<EmitEvents, SocketData> {
5252
return this.to(room);
5353
}
5454

@@ -59,7 +59,9 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
5959
* @return a new BroadcastOperator instance
6060
* @public
6161
*/
62-
public except(room: Room | Room[]): BroadcastOperator<EmitEvents> {
62+
public except(
63+
room: Room | Room[]
64+
): BroadcastOperator<EmitEvents, SocketData> {
6365
const exceptRooms = new Set(this.exceptRooms);
6466
if (Array.isArray(room)) {
6567
room.forEach((r) => exceptRooms.add(r));
@@ -81,7 +83,9 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
8183
* @return a new BroadcastOperator instance
8284
* @public
8385
*/
84-
public compress(compress: boolean): BroadcastOperator<EmitEvents> {
86+
public compress(
87+
compress: boolean
88+
): BroadcastOperator<EmitEvents, SocketData> {
8589
const flags = Object.assign({}, this.flags, { compress });
8690
return new BroadcastOperator(
8791
this.adapter,
@@ -99,7 +103,7 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
99103
* @return a new BroadcastOperator instance
100104
* @public
101105
*/
102-
public get volatile(): BroadcastOperator<EmitEvents> {
106+
public get volatile(): BroadcastOperator<EmitEvents, SocketData> {
103107
const flags = Object.assign({}, this.flags, { volatile: true });
104108
return new BroadcastOperator(
105109
this.adapter,
@@ -115,7 +119,7 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
115119
* @return a new BroadcastOperator instance
116120
* @public
117121
*/
118-
public get local(): BroadcastOperator<EmitEvents> {
122+
public get local(): BroadcastOperator<EmitEvents, SocketData> {
119123
const flags = Object.assign({}, this.flags, { local: true });
120124
return new BroadcastOperator(
121125
this.adapter,
@@ -177,7 +181,9 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
177181
*
178182
* @public
179183
*/
180-
public fetchSockets(): Promise<RemoteSocket<EmitEvents>[]> {
184+
public fetchSockets<SocketData = any>(): Promise<
185+
RemoteSocket<EmitEvents, SocketData>[]
186+
> {
181187
return this.adapter
182188
.fetchSockets({
183189
rooms: this.rooms,
@@ -187,9 +193,12 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
187193
return sockets.map((socket) => {
188194
if (socket instanceof Socket) {
189195
// FIXME the TypeScript compiler complains about missing private properties
190-
return socket as unknown as RemoteSocket<EmitEvents>;
196+
return socket as unknown as RemoteSocket<EmitEvents, SocketData>;
191197
} else {
192-
return new RemoteSocket(this.adapter, socket as SocketDetails);
198+
return new RemoteSocket(
199+
this.adapter,
200+
socket as SocketDetails<SocketData>
201+
);
193202
}
194203
});
195204
});
@@ -247,27 +256,27 @@ export class BroadcastOperator<EmitEvents extends EventsMap>
247256
/**
248257
* Format of the data when the Socket instance exists on another Socket.IO server
249258
*/
250-
interface SocketDetails {
259+
interface SocketDetails<SocketData> {
251260
id: SocketId;
252261
handshake: Handshake;
253262
rooms: Room[];
254-
data: any;
263+
data: SocketData;
255264
}
256265

257266
/**
258267
* Expose of subset of the attributes and methods of the Socket class
259268
*/
260-
export class RemoteSocket<EmitEvents extends EventsMap>
269+
export class RemoteSocket<EmitEvents extends EventsMap, SocketData>
261270
implements TypedEventBroadcaster<EmitEvents>
262271
{
263272
public readonly id: SocketId;
264273
public readonly handshake: Handshake;
265274
public readonly rooms: Set<Room>;
266-
public readonly data: any;
275+
public readonly data: SocketData;
267276

268-
private readonly operator: BroadcastOperator<EmitEvents>;
277+
private readonly operator: BroadcastOperator<EmitEvents, SocketData>;
269278

270-
constructor(adapter: Adapter, details: SocketDetails) {
279+
constructor(adapter: Adapter, details: SocketDetails<SocketData>) {
271280
this.id = details.id;
272281
this.handshake = details.handshake;
273282
this.rooms = new Set(details.rooms);

‎lib/index.ts

+11-7
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ export class Server<
664664
* @return self
665665
* @public
666666
*/
667-
public to(room: Room | Room[]): BroadcastOperator<EmitEvents> {
667+
public to(room: Room | Room[]): BroadcastOperator<EmitEvents, SocketData> {
668668
return this.sockets.to(room);
669669
}
670670

@@ -675,7 +675,7 @@ export class Server<
675675
* @return self
676676
* @public
677677
*/
678-
public in(room: Room | Room[]): BroadcastOperator<EmitEvents> {
678+
public in(room: Room | Room[]): BroadcastOperator<EmitEvents, SocketData> {
679679
return this.sockets.in(room);
680680
}
681681

@@ -686,7 +686,9 @@ export class Server<
686686
* @return self
687687
* @public
688688
*/
689-
public except(name: Room | Room[]): BroadcastOperator<EmitEvents> {
689+
public except(
690+
name: Room | Room[]
691+
): BroadcastOperator<EmitEvents, SocketData> {
690692
return this.sockets.except(name);
691693
}
692694

@@ -742,7 +744,9 @@ export class Server<
742744
* @return self
743745
* @public
744746
*/
745-
public compress(compress: boolean): BroadcastOperator<EmitEvents> {
747+
public compress(
748+
compress: boolean
749+
): BroadcastOperator<EmitEvents, SocketData> {
746750
return this.sockets.compress(compress);
747751
}
748752

@@ -754,7 +758,7 @@ export class Server<
754758
* @return self
755759
* @public
756760
*/
757-
public get volatile(): BroadcastOperator<EmitEvents> {
761+
public get volatile(): BroadcastOperator<EmitEvents, SocketData> {
758762
return this.sockets.volatile;
759763
}
760764

@@ -764,7 +768,7 @@ export class Server<
764768
* @return self
765769
* @public
766770
*/
767-
public get local(): BroadcastOperator<EmitEvents> {
771+
public get local(): BroadcastOperator<EmitEvents, SocketData> {
768772
return this.sockets.local;
769773
}
770774

@@ -773,7 +777,7 @@ export class Server<
773777
*
774778
* @public
775779
*/
776-
public fetchSockets(): Promise<RemoteSocket<EmitEvents>[]> {
780+
public fetchSockets(): Promise<RemoteSocket<EmitEvents, SocketData>[]> {
777781
return this.sockets.fetchSockets();
778782
}
779783

‎lib/namespace.ts

+15-8
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ export class Namespace<
175175
* @return self
176176
* @public
177177
*/
178-
public to(room: Room | Room[]): BroadcastOperator<EmitEvents> {
178+
public to(room: Room | Room[]): BroadcastOperator<EmitEvents, SocketData> {
179179
return new BroadcastOperator(this.adapter).to(room);
180180
}
181181

@@ -186,7 +186,7 @@ export class Namespace<
186186
* @return self
187187
* @public
188188
*/
189-
public in(room: Room | Room[]): BroadcastOperator<EmitEvents> {
189+
public in(room: Room | Room[]): BroadcastOperator<EmitEvents, SocketData> {
190190
return new BroadcastOperator(this.adapter).in(room);
191191
}
192192

@@ -197,7 +197,9 @@ export class Namespace<
197197
* @return self
198198
* @public
199199
*/
200-
public except(room: Room | Room[]): BroadcastOperator<EmitEvents> {
200+
public except(
201+
room: Room | Room[]
202+
): BroadcastOperator<EmitEvents, SocketData> {
201203
return new BroadcastOperator(this.adapter).except(room);
202204
}
203205

@@ -274,7 +276,10 @@ export class Namespace<
274276
ev: Ev,
275277
...args: EventParams<EmitEvents, Ev>
276278
): boolean {
277-
return new BroadcastOperator<EmitEvents>(this.adapter).emit(ev, ...args);
279+
return new BroadcastOperator<EmitEvents, SocketData>(this.adapter).emit(
280+
ev,
281+
...args
282+
);
278283
}
279284

280285
/**
@@ -346,7 +351,9 @@ export class Namespace<
346351
* @return self
347352
* @public
348353
*/
349-
public compress(compress: boolean): BroadcastOperator<EmitEvents> {
354+
public compress(
355+
compress: boolean
356+
): BroadcastOperator<EmitEvents, SocketData> {
350357
return new BroadcastOperator(this.adapter).compress(compress);
351358
}
352359

@@ -358,7 +365,7 @@ export class Namespace<
358365
* @return self
359366
* @public
360367
*/
361-
public get volatile(): BroadcastOperator<EmitEvents> {
368+
public get volatile(): BroadcastOperator<EmitEvents, SocketData> {
362369
return new BroadcastOperator(this.adapter).volatile;
363370
}
364371

@@ -368,7 +375,7 @@ export class Namespace<
368375
* @return self
369376
* @public
370377
*/
371-
public get local(): BroadcastOperator<EmitEvents> {
378+
public get local(): BroadcastOperator<EmitEvents, SocketData> {
372379
return new BroadcastOperator(this.adapter).local;
373380
}
374381

@@ -377,7 +384,7 @@ export class Namespace<
377384
*
378385
* @public
379386
*/
380-
public fetchSockets(): Promise<RemoteSocket<EmitEvents>[]> {
387+
public fetchSockets(): Promise<RemoteSocket<EmitEvents, SocketData>[]> {
381388
return new BroadcastOperator(this.adapter).fetchSockets();
382389
}
383390

‎lib/parent-namespace.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class ParentNamespace<
6565
return namespace;
6666
}
6767

68-
fetchSockets(): Promise<RemoteSocket<EmitEvents>[]> {
68+
fetchSockets(): Promise<RemoteSocket<EmitEvents, SocketData>[]> {
6969
// note: we could make the fetchSockets() method work for dynamic namespaces created with a regex (by sending the
7070
// regex to the other Socket.IO servers, and returning the sockets of each matching namespace for example), but
7171
// the behavior for namespaces created with a function is less clear

‎lib/socket.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ export class Socket<
251251
* @return self
252252
* @public
253253
*/
254-
public to(room: Room | Room[]): BroadcastOperator<EmitEvents> {
254+
public to(room: Room | Room[]): BroadcastOperator<EmitEvents, SocketData> {
255255
return this.newBroadcastOperator().to(room);
256256
}
257257

@@ -262,7 +262,7 @@ export class Socket<
262262
* @return self
263263
* @public
264264
*/
265-
public in(room: Room | Room[]): BroadcastOperator<EmitEvents> {
265+
public in(room: Room | Room[]): BroadcastOperator<EmitEvents, SocketData> {
266266
return this.newBroadcastOperator().in(room);
267267
}
268268

@@ -273,7 +273,9 @@ export class Socket<
273273
* @return self
274274
* @public
275275
*/
276-
public except(room: Room | Room[]): BroadcastOperator<EmitEvents> {
276+
public except(
277+
room: Room | Room[]
278+
): BroadcastOperator<EmitEvents, SocketData> {
277279
return this.newBroadcastOperator().except(room);
278280
}
279281

@@ -577,7 +579,7 @@ export class Socket<
577579
* @return {Socket} self
578580
* @public
579581
*/
580-
public get broadcast(): BroadcastOperator<EmitEvents> {
582+
public get broadcast(): BroadcastOperator<EmitEvents, SocketData> {
581583
return this.newBroadcastOperator();
582584
}
583585

@@ -587,7 +589,7 @@ export class Socket<
587589
* @return {Socket} self
588590
* @public
589591
*/
590-
public get local(): BroadcastOperator<EmitEvents> {
592+
public get local(): BroadcastOperator<EmitEvents, SocketData> {
591593
return this.newBroadcastOperator().local;
592594
}
593595

@@ -764,7 +766,7 @@ export class Socket<
764766
return this._anyListeners || [];
765767
}
766768

767-
private newBroadcastOperator(): BroadcastOperator<EmitEvents> {
769+
private newBroadcastOperator(): BroadcastOperator<EmitEvents, SocketData> {
768770
const flags = Object.assign({}, this.flags);
769771
this.flags = {};
770772
return new BroadcastOperator(

0 commit comments

Comments
 (0)
Please sign in to comment.