@@ -551,7 +551,7 @@ class SockoptStreamSettings extends CommonClass {
551551 }
552552}
553553
554- class FinalMask extends CommonClass {
554+ class UdpMask extends CommonClass {
555555 constructor ( type = 'salamander' , settings = { } ) {
556556 super ( ) ;
557557 this . type = type ;
@@ -579,20 +579,34 @@ class FinalMask extends CommonClass {
579579 }
580580
581581 static fromJson ( json = { } ) {
582- return new FinalMask (
582+ return new UdpMask (
583583 json . type || 'salamander' ,
584584 json . settings || { }
585585 ) ;
586586 }
587587
588588 toJson ( ) {
589- const result = {
590- type : this . type
589+ return {
590+ type : this . type ,
591+ settings : ( this . settings && Object . keys ( this . settings ) . length > 0 ) ? this . settings : undefined
592+ } ;
593+ }
594+ }
595+
596+ class FinalMaskStreamSettings extends CommonClass {
597+ constructor ( udp = [ ] ) {
598+ super ( ) ;
599+ this . udp = Array . isArray ( udp ) ? udp . map ( u => new UdpMask ( u . type , u . settings ) ) : [ new UdpMask ( udp . type , udp . settings ) ] ;
600+ }
601+
602+ static fromJson ( json = { } ) {
603+ return new FinalMaskStreamSettings ( json . udp || [ ] ) ;
604+ }
605+
606+ toJson ( ) {
607+ return {
608+ udp : this . udp . map ( udp => udp . toJson ( ) )
591609 } ;
592- if ( this . settings && Object . keys ( this . settings ) . length > 0 ) {
593- result . settings = this . settings ;
594- }
595- return result ;
596610 }
597611}
598612
@@ -609,7 +623,7 @@ class StreamSettings extends CommonClass {
609623 httpupgradeSettings = new HttpUpgradeStreamSettings ( ) ,
610624 xhttpSettings = new xHTTPStreamSettings ( ) ,
611625 hysteriaSettings = new HysteriaStreamSettings ( ) ,
612- finalmask = { udp : [ ] } ,
626+ finalmask = new FinalMaskStreamSettings ( ) ,
613627 sockopt = undefined ,
614628 ) {
615629 super ( ) ;
@@ -629,10 +643,7 @@ class StreamSettings extends CommonClass {
629643 }
630644
631645 addUdpMask ( type = 'salamander' ) {
632- if ( ! this . finalmask . udp ) {
633- this . finalmask . udp = [ ] ;
634- }
635- this . finalmask . udp . push ( new FinalMask ( type ) ) ;
646+ this . finalmask . udp . push ( new UdpMask ( type ) ) ;
636647 }
637648
638649 delUdpMask ( index ) {
@@ -641,6 +652,10 @@ class StreamSettings extends CommonClass {
641652 }
642653 }
643654
655+ get hasFinalMask ( ) {
656+ return this . finalmask . udp && this . finalmask . udp . length > 0 ;
657+ }
658+
644659 get isTls ( ) {
645660 return this . security === 'tls' ;
646661 }
@@ -658,14 +673,6 @@ class StreamSettings extends CommonClass {
658673 }
659674
660675 static fromJson ( json = { } ) {
661- let finalmask = { udp : [ ] } ;
662- if ( json . finalmask ) {
663- if ( Array . isArray ( json . finalmask ) ) {
664- finalmask . udp = json . finalmask . map ( mask => FinalMask . fromJson ( mask ) ) ;
665- } else if ( json . finalmask . udp ) {
666- finalmask . udp = json . finalmask . udp . map ( mask => FinalMask . fromJson ( mask ) ) ;
667- }
668- }
669676 return new StreamSettings (
670677 json . network ,
671678 json . security ,
@@ -678,7 +685,7 @@ class StreamSettings extends CommonClass {
678685 HttpUpgradeStreamSettings . fromJson ( json . httpupgradeSettings ) ,
679686 xHTTPStreamSettings . fromJson ( json . xhttpSettings ) ,
680687 HysteriaStreamSettings . fromJson ( json . hysteriaSettings ) ,
681- finalmask ,
688+ FinalMaskStreamSettings . fromJson ( json . finalmask ) ,
682689 SockoptStreamSettings . fromJson ( json . sockopt ) ,
683690 ) ;
684691 }
@@ -697,9 +704,7 @@ class StreamSettings extends CommonClass {
697704 httpupgradeSettings : network === 'httpupgrade' ? this . httpupgrade . toJson ( ) : undefined ,
698705 xhttpSettings : network === 'xhttp' ? this . xhttp . toJson ( ) : undefined ,
699706 hysteriaSettings : network === 'hysteria' ? this . hysteria . toJson ( ) : undefined ,
700- finalmask : ( this . finalmask . udp && this . finalmask . udp . length > 0 ) ? {
701- udp : this . finalmask . udp . map ( mask => mask . toJson ( ) )
702- } : undefined ,
707+ finalmask : this . hasFinalMask ? this . finalmask . toJson ( ) : undefined ,
703708 sockopt : this . sockopt != undefined ? this . sockopt . toJson ( ) : undefined ,
704709 } ;
705710 }
@@ -793,7 +798,7 @@ class Outbound extends CommonClass {
793798
794799 canEnableMux ( ) {
795800 // Disable Mux if flow is set
796- if ( this . settings . flow && this . settings . flow !== '' ) {
801+ if ( this . settings ? .flow && this . settings . flow !== '' ) {
797802 this . mux . enabled = false ;
798803 return false ;
799804 }
@@ -1045,7 +1050,10 @@ class Outbound extends CommonClass {
10451050 stream . hysteria . disablePathMTUDiscovery = urlParams . get ( 'disablePathMTUDiscovery' ) === 'true' ;
10461051 }
10471052 if ( urlParams . has ( 'obfs' ) ) {
1048- stream . udpmasks [ 0 ] = new UdpMask ( urlParams . get ( 'obfs' ) , urlParams . get ( 'obfs-password' ) ) ;
1053+ stream . finalmask = new FinalMaskStreamSettings ( [ {
1054+ type : urlParams . get ( 'obfs' ) ,
1055+ settings : { password : urlParams . get ( 'obfs-password' ) ?? '' }
1056+ } ] ) ;
10491057 }
10501058 if ( urlParams . has ( 'security' ) ) {
10511059 stream . security = urlParams . get ( 'security' ) ;
0 commit comments