@@ -20,35 +20,43 @@ export interface ExtendedError extends Error {
2020
2121export interface NamespaceReservedEventsMap <
2222 ListenEvents extends EventsMap ,
23- EmitEvents extends EventsMap
23+ EmitEvents extends EventsMap ,
24+ ServerSideEvents extends EventsMap
2425> {
25- connect : ( socket : Socket < ListenEvents , EmitEvents > ) => void ;
26- connection : ( socket : Socket < ListenEvents , EmitEvents > ) => void ;
26+ connect : ( socket : Socket < ListenEvents , EmitEvents , ServerSideEvents > ) => void ;
27+ connection : (
28+ socket : Socket < ListenEvents , EmitEvents , ServerSideEvents >
29+ ) => void ;
2730}
2831
32+ export const RESERVED_EVENTS : ReadonlySet < string | Symbol > = new Set <
33+ keyof NamespaceReservedEventsMap < never , never , never >
34+ > ( < const > [ "connect" , "connection" ] ) ;
35+
2936export class Namespace <
3037 ListenEvents extends EventsMap = DefaultEventsMap ,
31- EmitEvents extends EventsMap = ListenEvents
38+ EmitEvents extends EventsMap = ListenEvents ,
39+ ServerSideEvents extends EventsMap = { }
3240> extends StrictEventEmitter <
33- { } ,
41+ ServerSideEvents ,
3442 EmitEvents ,
35- NamespaceReservedEventsMap < ListenEvents , EmitEvents >
43+ NamespaceReservedEventsMap < ListenEvents , EmitEvents , ServerSideEvents >
3644> {
3745 public readonly name : string ;
3846 public readonly sockets : Map <
3947 SocketId ,
40- Socket < ListenEvents , EmitEvents >
48+ Socket < ListenEvents , EmitEvents , ServerSideEvents >
4149 > = new Map ( ) ;
4250
4351 public adapter : Adapter ;
4452
4553 /** @private */
46- readonly server : Server < ListenEvents , EmitEvents > ;
54+ readonly server : Server < ListenEvents , EmitEvents , ServerSideEvents > ;
4755
4856 /** @private */
4957 _fns : Array <
5058 (
51- socket : Socket < ListenEvents , EmitEvents > ,
59+ socket : Socket < ListenEvents , EmitEvents , ServerSideEvents > ,
5260 next : ( err ?: ExtendedError ) => void
5361 ) => void
5462 > = [ ] ;
@@ -62,7 +70,10 @@ export class Namespace<
6270 * @param server instance
6371 * @param name
6472 */
65- constructor ( server : Server < ListenEvents , EmitEvents > , name : string ) {
73+ constructor (
74+ server : Server < ListenEvents , EmitEvents , ServerSideEvents > ,
75+ name : string
76+ ) {
6677 super ( ) ;
6778 this . server = server ;
6879 this . name = name ;
@@ -88,7 +99,7 @@ export class Namespace<
8899 */
89100 public use (
90101 fn : (
91- socket : Socket < ListenEvents , EmitEvents > ,
102+ socket : Socket < ListenEvents , EmitEvents , ServerSideEvents > ,
92103 next : ( err ?: ExtendedError ) => void
93104 ) => void
94105 ) : this {
@@ -104,7 +115,7 @@ export class Namespace<
104115 * @private
105116 */
106117 private run (
107- socket : Socket < ListenEvents , EmitEvents > ,
118+ socket : Socket < ListenEvents , EmitEvents , ServerSideEvents > ,
108119 fn : ( err : ExtendedError | null ) => void
109120 ) {
110121 const fns = this . _fns . slice ( 0 ) ;
@@ -166,10 +177,10 @@ export class Namespace<
166177 * @private
167178 */
168179 _add (
169- client : Client < ListenEvents , EmitEvents > ,
180+ client : Client < ListenEvents , EmitEvents , ServerSideEvents > ,
170181 query ,
171182 fn ?: ( ) => void
172- ) : Socket < ListenEvents , EmitEvents > {
183+ ) : Socket < ListenEvents , EmitEvents , ServerSideEvents > {
173184 debug ( "adding socket to nsp %s" , this . name ) ;
174185 const socket = new Socket ( this , client , query ) ;
175186 this . run ( socket , ( err ) => {
@@ -212,7 +223,7 @@ export class Namespace<
212223 *
213224 * @private
214225 */
215- _remove ( socket : Socket < ListenEvents , EmitEvents > ) : void {
226+ _remove ( socket : Socket < ListenEvents , EmitEvents , ServerSideEvents > ) : void {
216227 if ( this . sockets . has ( socket . id ) ) {
217228 this . sockets . delete ( socket . id ) ;
218229 } else {
@@ -255,6 +266,37 @@ export class Namespace<
255266 return this ;
256267 }
257268
269+ /**
270+ * Emit a packet to other Socket.IO servers
271+ *
272+ * @param ev - the event name
273+ * @param args - an array of arguments, which may include an acknowledgement callback at the end
274+ * @public
275+ */
276+ public serverSideEmit < Ev extends EventNames < ServerSideEvents > > (
277+ ev : Ev ,
278+ ...args : EventParams < ServerSideEvents , Ev >
279+ ) : boolean {
280+ if ( RESERVED_EVENTS . has ( ev ) ) {
281+ throw new Error ( `"${ ev } " is a reserved event name` ) ;
282+ }
283+ args . unshift ( ev ) ;
284+ this . adapter . serverSideEmit ( args ) ;
285+ return true ;
286+ }
287+
288+ /**
289+ * Called when a packet is received from another Socket.IO server
290+ *
291+ * @param args - an array of arguments, which may include an acknowledgement callback at the end
292+ *
293+ * @private
294+ */
295+ _onServerSideEmit ( args : any [ ] ) {
296+ const event = args . shift ( ) ;
297+ this . emitUntyped ( event , args ) ;
298+ }
299+
258300 /**
259301 * Gets a list of clients.
260302 *
0 commit comments