File tree Expand file tree Collapse file tree 2 files changed +36
-5
lines changed
Expand file tree Collapse file tree 2 files changed +36
-5
lines changed Original file line number Diff line number Diff line change @@ -476,16 +476,30 @@ export class Socket<
476476 * socket.leave("room1");
477477 *
478478 * // leave multiple rooms
479- * socket.leave("room1").leave( "room2");
479+ * socket.leave([ "room1", "room2"] );
480480 * });
481481 *
482- * @param {String } room
482+ * @param {String|Array } rooms - room or array of rooms
483483 * @return a Promise or nothing, depending on the adapter
484484 */
485- public leave ( room : string ) : Promise < void > | void {
486- debug ( "leave room %s" , room ) ;
485+ public leave ( rooms : Room | Array < Room > ) : Promise < void > | void {
486+ const roomsSet = new Set ( Array . isArray ( rooms ) ? rooms : [ rooms ] ) ;
487+ const promises : Array < Promise < void > > = [ ] ;
488+
489+ roomsSet . forEach ( ( room ) => {
490+ debug ( "leave room %s" , room ) ;
491+ const maybePromise = this . adapter . del ( this . id , room ) ;
492+ if (
493+ maybePromise &&
494+ typeof ( maybePromise as Promise < void > ) . then === "function"
495+ ) {
496+ promises . push ( maybePromise as Promise < void > ) ;
497+ }
498+ } ) ;
487499
488- return this . adapter . del ( this . id , room ) ;
500+ if ( promises . length ) {
501+ return Promise . all ( promises ) . then ( ( ) => undefined ) ;
502+ }
489503 }
490504
491505 /**
Original file line number Diff line number Diff line change @@ -941,6 +941,23 @@ describe("socket", () => {
941941 } ) ;
942942 } ) ;
943943
944+ it ( "should leave multiple rooms at once" , ( done ) => {
945+ const io = new Server ( 0 ) ;
946+ const client = createClient ( io , "/" ) ;
947+
948+ io . on ( "connection" , ( socket ) => {
949+ Promise . resolve ( socket . join ( [ "room1" , "room2" ] ) )
950+ . then ( ( ) => Promise . resolve ( socket . leave ( [ "room1" , "room2" ] ) ) )
951+ . then ( ( ) => {
952+ const adapter = io . of ( "/" ) . adapter ;
953+ expect ( adapter . rooms . has ( "room1" ) ) . to . be ( false ) ;
954+ expect ( adapter . rooms . has ( "room2" ) ) . to . be ( false ) ;
955+ success ( done , io , client ) ;
956+ } )
957+ . catch ( done ) ;
958+ } ) ;
959+ } ) ;
960+
944961 describe ( "onAny" , ( ) => {
945962 it ( "should call listener" , ( done ) => {
946963 const io = new Server ( 0 ) ;
You can’t perform that action at this time.
0 commit comments