@@ -11,30 +11,17 @@ class SocketWSServer extends SocketServer {
1111 constructor ( server , path ) {
1212 super ( server , path ) ;
1313 this . wss = new WebSocket . Server ( { server } ) ;
14- this . wss . broadcast = ( message , socket ) => {
15- this . wss . clients . forEach ( ( client ) => {
16- if ( client !== socket && client . readyState === WebSocket . OPEN ) {
17- client . send ( message ) ;
18- }
19- } ) ;
20- } ;
21- this . wss . broadcastAll = ( message ) => {
22- this . wss . clients . forEach ( ( client ) => {
23- if ( client . readyState === WebSocket . OPEN ) {
24- client . send ( message ) ;
25- }
26- } ) ;
27- } ;
28- this . adapter = null ;
2914 cds . ws = this . wss ;
3015 cds . wss = this . wss ;
16+ this . adapter = null ;
3117 }
3218
3319 async setup ( ) {
3420 await this . _applyAdapter ( ) ;
3521 }
3622
3723 service ( service , connected ) {
24+ this . adapter ?. on ( service ) ;
3825 this . wss . on ( "connection" , async ( ws , request ) => {
3926 ws . request = request ;
4027 if ( ws . request ?. url !== `${ this . path } ${ service } ` ) {
@@ -51,6 +38,7 @@ class SocketWSServer extends SocketServer {
5138 try {
5239 connected &&
5340 connected ( {
41+ service,
5442 socket : ws ,
5543 setup : ( ) => {
5644 this . _enforceAuth ( ws ) ;
@@ -66,18 +54,16 @@ class SocketWSServer extends SocketServer {
6654 } ,
6755 on : ( event , callback ) => {
6856 ws . on ( "message" , async ( message ) => {
69- let payload ;
57+ let payload = { } ;
7058 try {
7159 payload = JSON . parse ( message ) ;
7260 } catch ( _ ) {
7361 // ignore
7462 }
7563 try {
7664 if ( payload ?. event === event ) {
65+ await this . adapter ?. emit ( service , message ) ;
7766 await callback ( payload . data ) ;
78- if ( this . adapter ) {
79- await this . adapter . emit ( message ) ;
80- }
8167 }
8268 } catch ( err ) {
8369 LOG ?. error ( err ) ;
@@ -93,13 +79,7 @@ class SocketWSServer extends SocketServer {
9379 ) ;
9480 } ,
9581 broadcast : ( event , data ) => {
96- this . wss . broadcast (
97- JSON . stringify ( {
98- event,
99- data,
100- } ) ,
101- ws ,
102- ) ;
82+ this . broadcast ( service , event , data , ws , true ) ;
10383 } ,
10484 disconnect ( ) {
10585 ws . disconnect ( ) ;
@@ -112,6 +92,28 @@ class SocketWSServer extends SocketServer {
11292 } ) ;
11393 }
11494
95+ async broadcast ( service , event , data , socket , multiple ) {
96+ const clients = [ ] ;
97+ this . wss . clients . forEach ( ( client ) => {
98+ if (
99+ client . readyState === WebSocket . OPEN &&
100+ client !== socket &&
101+ client . request ?. url === `${ this . path } ${ service } `
102+ ) {
103+ clients . push ( client ) ;
104+ }
105+ } ) ;
106+ if ( clients . length > 0 || multiple ) {
107+ const message = ! data ? event : JSON . stringify ( { event, data } ) ;
108+ clients . forEach ( ( client ) => {
109+ client . send ( message ) ;
110+ } ) ;
111+ if ( multiple ) {
112+ await this . adapter ?. emit ( service , message ) ;
113+ }
114+ }
115+ }
116+
115117 async _applyAdapter ( ) {
116118 try {
117119 const adapterImpl = cds . env . requires ?. websocket ?. adapter ?. impl ;
@@ -120,11 +122,10 @@ class SocketWSServer extends SocketServer {
120122 if ( cds . env . requires . websocket ?. adapter ?. options ) {
121123 options = { ...options , ...cds . env . requires . websocket ?. adapter ?. options } ;
122124 }
123- const channel = options ?. key ?? "websocket" ;
125+ const prefix = options ?. key ?? "websocket" ;
124126 this . adapterFactory = require ( `../adapter/${ adapterImpl } ` ) ;
125- this . adapter = new this . adapterFactory ( this , channel , options ) ;
126- await this . adapter . setup ( ) ;
127- await this . adapter . on ( ) ;
127+ this . adapter = new this . adapterFactory ( this , prefix , options ) ;
128+ await this . adapter ?. setup ( ) ;
128129 }
129130 } catch ( err ) {
130131 LOG ?. error ( err ) ;
0 commit comments