@@ -104,6 +104,11 @@ export interface ChannelHandlerOptions {
104104 serializer ?: ISerializer < ChannelMessage , any > ;
105105}
106106
107+ enum ServerChannelCloseCode {
108+ ConnectionClosed = 1 ,
109+ NewChannelOpened = 2 ,
110+ }
111+
107112export abstract class BaseCommonChannelHandler {
108113 protected channelMap : Map < string , WSServerChannel > = new Map ( ) ;
109114
@@ -135,25 +140,24 @@ export abstract class BaseCommonChannelHandler {
135140
136141 const wrappedConnection = wrapSerializer ( connection , this . serializer ) ;
137142
138- const getOrCreateChannel = ( id : string , clientId : string ) => {
139- let channel = this . channelMap . get ( id ) ;
140- if ( ! channel ) {
141- channel = new WSServerChannel ( wrappedConnection , { id, clientId, logger : this . logger } ) ;
142- this . channelMap . set ( id , channel ) ;
143- }
144- return channel ;
145- } ;
146-
147143 wrappedConnection . onMessage ( ( msg : ChannelMessage ) => {
148144 try {
149145 switch ( msg . kind ) {
150146 case 'open' : {
151- const { id, path, connectionToken } = msg ;
147+ const { id, path, traceId } = msg ;
152148 clientId = msg . clientId ;
149+
153150 this . logger . log ( `open a new connection channel ${ clientId } with path ${ path } ` ) ;
154- const channel = getOrCreateChannel ( id , clientId ) ;
151+ let channel = this . channelMap . get ( id ) ;
152+ if ( channel ) {
153+ channel . close ( ServerChannelCloseCode . NewChannelOpened , 'new channel opened for the same channel id' ) ;
154+ channel . dispose ( ) ;
155+ }
156+
157+ channel = new WSServerChannel ( wrappedConnection , { id, clientId, logger : this . logger } ) ;
158+ this . channelMap . set ( id , channel ) ;
155159 commonChannelPathHandler . openChannel ( path , channel , clientId ) ;
156- channel . serverReady ( connectionToken ) ;
160+ channel . serverReady ( traceId ) ;
157161 break ;
158162 }
159163 default : {
@@ -186,7 +190,7 @@ export abstract class BaseCommonChannelHandler {
186190 Array . from ( this . channelMap . values ( ) )
187191 . filter ( ( channel ) => channel . clientId === clientId )
188192 . forEach ( ( channel ) => {
189- channel . close ( 1 , 'close ' ) ;
193+ channel . close ( ServerChannelCloseCode . ConnectionClosed , 'connection closed ' ) ;
190194 channel . dispose ( ) ;
191195 this . channelMap . delete ( channel . id ) ;
192196 this . logger . log ( `Remove connection channel ${ channel . id } ` ) ;
0 commit comments