@@ -297,6 +297,11 @@ export function makeIBCProtocolHandler(
297
297
*/
298
298
const outboundWaiters = makeStore ( 'destination' ) ;
299
299
300
+ /**
301
+ * @type {Store<Port, Set<PromiseRecord<ConnectionHandler,any>>> }
302
+ */
303
+ const portToPendingConns = makeStore ( 'Port' ) ;
304
+
300
305
/**
301
306
* @type {ProtocolHandler }
302
307
*/
@@ -315,14 +320,16 @@ export function makeIBCProtocolHandler(
315
320
async onBind ( port , localAddr , _protocolHandler ) {
316
321
const portID = localAddrToPortID ( localAddr ) ;
317
322
portToCircuits . init ( port , [ ] ) ;
323
+ portToPendingConns . init ( port , new Set ( ) ) ;
318
324
const packet = {
319
325
source_port : portID ,
320
326
} ;
321
327
return callIBCDevice ( 'bindPort' , { packet } ) ;
322
328
} ,
323
- async onConnect ( _port , localAddr , remoteAddr , chandler , _protocolHandler ) {
329
+ async onConnect ( port , localAddr , remoteAddr , chandler , _protocolHandler ) {
324
330
console . warn ( 'IBC onConnect' , localAddr , remoteAddr ) ;
325
331
const portID = localAddrToPortID ( localAddr ) ;
332
+ const pendingConns = portToPendingConns . get ( port ) ;
326
333
327
334
const match = remoteAddr . match (
328
335
/ ^ ( \/ i b c - h o p \/ [ ^ / ] + ) * \/ i b c - p o r t \/ ( [ ^ / ] + ) \/ ( o r d e r e d | u n o r d e r e d ) \/ ( [ ^ / ] + ) $ / s,
@@ -352,13 +359,15 @@ export function makeIBCProtocolHandler(
352
359
const rChannelID = generateChannelID ( ) ;
353
360
354
361
const rchandler = producePromise ( ) ;
362
+ pendingConns . add ( rchandler ) ;
355
363
356
364
/**
357
365
* @type {typeof makeIBCConnectionHandler }
358
366
*/
359
367
function connected ( cID , pID , rCID , rPID , ord ) {
360
368
const ch = makeIBCConnectionHandler ( cID , pID , rCID , rPID , ord ) ;
361
369
rchandler . resolve ( ch ) ;
370
+ pendingConns . delete ( rchandler ) ;
362
371
return ch ;
363
372
}
364
373
@@ -459,7 +468,13 @@ paths:
459
468
} ,
460
469
async onRevoke ( port , localAddr , _protocolHandler ) {
461
470
console . warn ( 'IBC onRevoke' , localAddr ) ;
471
+ const pendingConns = portToPendingConns . get ( port ) ;
472
+ portToPendingConns . delete ( port ) ;
462
473
portToCircuits . delete ( port ) ;
474
+ const revoked = Error ( `Port ${ localAddr } revoked` ) ;
475
+ for ( const rchandler of pendingConns . values ( ) ) {
476
+ rchandler . reject ( revoked ) ;
477
+ }
463
478
} ,
464
479
} ) ;
465
480
0 commit comments