@@ -47,13 +47,14 @@ import {
4747  StreamAddOutgoingParam , 
4848  type  StreamParam , 
4949}  from  "./param" ; 
50- import  {  SctpReconfig  }  from  "./reconfig" ; 
51- import  {  StreamManager  }  from  "./stream" ; 
52- import  {  SCTPTimerManager  }  from  "./timer" ; 
50+ import  {  type   ReconfigDto ,   SctpReconfig  }  from  "./reconfig" ; 
51+ import  {  StreamManager ,   type   StreamManagerStateDTO  }  from  "./stream" ; 
52+ import  {  type   SCTPTimerDto ,   SCTPTimerManager  }  from  "./timer" ; 
5353import  { 
5454  type  SCTPConnectionState , 
5555  SCTPConnectionStates , 
5656  SCTPTransmitter , 
57+   type  SCTPTransmitterDto , 
5758}  from  "./transmitter" ; 
5859import  type  {  Transport  }  from  "./transport" ; 
5960import  {  tsnMinusOne ,  tsnPlusOne  }  from  "./util" ; 
@@ -63,27 +64,26 @@ const log = debug("werift/sctp/sctp");
6364// SSN: Stream Sequence Number 
6465
6566export  class  SCTP  { 
66-   associationState  =  SCTP_STATE . CLOSED ; 
67-   started  =  false ; 
68-   isServer  =  true ; 
69- 
7067  private  readonly  hmacKey  =  randomBytes ( 16 ) ; 
7168  private  readonly  localPartialReliability  =  true ; 
7269  private  readonly  localVerificationTag  =  random32 ( ) ; 
7370
71+   associationState  =  SCTP_STATE . CLOSED ; 
72+   started  =  false ; 
73+   isServer  =  true ; 
7474  remoteExtensions : number [ ]  =  [ ] ; 
7575  remotePartialReliability  =  true ; 
76+   protected  lastReceivedTsn ?: number ;  // Transmission Sequence Number 
77+   protected  sackDuplicates : number [ ]  =  [ ] ; 
78+   protected  sackMisOrdered  =  new  Set < number > ( ) ; 
79+   protected  sackNeeded  =  false ; 
7680
77-   private  lastReceivedTsn ?: number ;  // Transmission Sequence Number 
78-   private  sackDuplicates : number [ ]  =  [ ] ; 
79-   private  sackMisOrdered  =  new  Set < number > ( ) ; 
80-   private  sackNeeded  =  false ; 
8181  private  sackTimeout : NodeJS . Immediate  |  undefined ; 
8282
83-   readonly   transmitter : SCTPTransmitter ; 
84-   readonly   timerManager : SCTPTimerManager ; 
85-   readonly   reconfig : SctpReconfig ; 
86-   readonly   stream   =   new   StreamManager ( ) ; 
83+   transmitter : SCTPTransmitter ; 
84+   timerManager : SCTPTimerManager ; 
85+   reconfig : SctpReconfig ; 
86+   stream :  StreamManager ; 
8787
8888  readonly  stateChanged : { 
8989    [ key  in  SCTPConnectionState ] : Event < [ ] > ; 
@@ -98,16 +98,29 @@ export class SCTP {
9898    public  transport : Transport , 
9999    public  port  =  5000 , 
100100  )  { 
101-     this . transport . onData  =  ( buf )  =>  { 
102-       this . handleData ( buf ) ; 
103-     } ; 
104101    this . timerManager  =  new  SCTPTimerManager ( { 
105102      sendChunk : async  ( chunk )  =>  { 
106103        await  this . transmitter . sendChunk ( chunk ) ; 
107104      } , 
108105    } ) ; 
109-     this . transmitter  =  new  SCTPTransmitter ( transport ,  this . timerManager ,  port ) ; 
110-     this . reconfig  =  new  SctpReconfig ( this . transmitter ,  this . timerManager ) ; 
106+     this . transmitter  =  new  SCTPTransmitter ( { 
107+       transport, 
108+       timerManager : this . timerManager , 
109+       port, 
110+     } ) ; 
111+     this . reconfig  =  new  SctpReconfig ( { 
112+       transmitter : this . transmitter , 
113+       timerManager : this . timerManager , 
114+     } ) ; 
115+     this . stream  =  new  StreamManager ( ) ; 
116+ 
117+     this . setup ( ) ; 
118+   } 
119+ 
120+   protected  setup ( )  { 
121+     this . transport . onData  =  ( buf )  =>  { 
122+       this . handleData ( buf ) ; 
123+     } ; 
111124
112125    this . timerManager . onT1Expired . subscribe ( ( )  =>  { 
113126      this . setState ( SCTP_STATE . CLOSED ) ; 
@@ -614,6 +627,73 @@ export class SCTP {
614627      this . reconfig . transmitReconfigRequest ( this . associationState ) ; 
615628    } 
616629  } 
630+ 
631+   toDto ( ) : SCTPDto  { 
632+     return  { 
633+       associationState : this . associationState , 
634+       started : this . started , 
635+       isServer : this . isServer , 
636+       remoteExtensions : this . remoteExtensions , 
637+       remotePartialReliability : this . remotePartialReliability , 
638+       port : this . port , 
639+       lastReceivedTsn : this . lastReceivedTsn , 
640+       sackDuplicates : this . sackDuplicates , 
641+       sackMisOrdered : Array . from ( this . sackMisOrdered ) , 
642+       sackNeeded : this . sackNeeded , 
643+       transmitter : this . transmitter . toDto ( ) , 
644+       timerManager : this . timerManager . toDto ( ) , 
645+       reconfig : this . reconfig . toDto ( ) , 
646+       stream : this . stream . toDto ( ) , 
647+     } ; 
648+   } 
649+ 
650+   fromDto ( dto : SCTPDto ,  transport : Transport )  { 
651+     const  sctp  =  new  SCTP ( transport ) ; 
652+     sctp . associationState  =  dto . associationState ; 
653+     sctp . started  =  dto . started ; 
654+     sctp . isServer  =  dto . isServer ; 
655+     sctp . remoteExtensions  =  dto . remoteExtensions ; 
656+     sctp . remotePartialReliability  =  dto . remotePartialReliability ; 
657+     sctp . port  =  dto . port ; 
658+     sctp . lastReceivedTsn  =  dto . lastReceivedTsn ; 
659+     sctp . sackDuplicates  =  dto . sackDuplicates ; 
660+     sctp . sackMisOrdered  =  new  Set ( dto . sackMisOrdered ) ; 
661+     sctp . sackNeeded  =  dto . sackNeeded ; 
662+ 
663+     sctp . timerManager  =  SCTPTimerManager . fromDto ( dto . timerManager ,  { 
664+       sendChunk : async  ( chunk )  =>  { 
665+         await  sctp . transmitter . sendChunk ( chunk ) ; 
666+       } , 
667+     } ) ; 
668+     sctp . transmitter  =  SCTPTransmitter . fromDto ( dto . transmitter ,  { 
669+       timerManager : sctp . timerManager , 
670+       transport, 
671+     } ) ; 
672+     sctp . reconfig  =  SctpReconfig . fromDto ( dto . reconfig ,  { 
673+       timerManager : sctp . timerManager , 
674+       transmitter : sctp . transmitter , 
675+     } ) ; 
676+     sctp . stream  =  StreamManager . fromDto ( dto . stream ) ; 
677+     sctp . setup ( ) ; 
678+     return  sctp ; 
679+   } 
680+ } 
681+ 
682+ export  interface  SCTPDto  { 
683+   associationState : SCTP_STATE ; 
684+   started : boolean ; 
685+   isServer : boolean ; 
686+   remoteExtensions : number [ ] ; 
687+   remotePartialReliability : boolean ; 
688+   port : number ; 
689+   lastReceivedTsn ?: number ; 
690+   sackDuplicates : number [ ] ; 
691+   sackMisOrdered : number [ ] ; 
692+   sackNeeded : boolean ; 
693+   transmitter : SCTPTransmitterDto ; 
694+   timerManager : SCTPTimerDto ; 
695+   reconfig : ReconfigDto ; 
696+   stream : StreamManagerStateDTO ; 
617697} 
618698
619699export  class  RTCSctpCapabilities  { 
0 commit comments