@@ -76,13 +76,18 @@ export default function ClashMeta_Producer() {
7676 return false ;
7777 } else if (
7878 hasMihomoShadowTls ( proxy ) &&
79- ( proxy . type !== 'ss' ||
79+ ( ! [ 'ss' , 'snell' ] . includes ( proxy . type ) ||
8080 ! isSupportedMihomoVersion (
8181 getMihomoShadowTlsVersion ( proxy ) ,
8282 [ 1 , 2 , 3 ] ,
8383 ) )
8484 ) {
8585 return false ;
86+ } else if ( hasMihomoSnellShadowTlsObfsConflict ( proxy ) ) {
87+ $ . error (
88+ `Platform Mihomo does not support Snell shadow-tls with obfs for proxy ${ proxy . name } . Proxy has been filtered.` ,
89+ ) ;
90+ return false ;
8691 } else if ( [ 'juicity' , 'naive' ] . includes ( proxy . type ) ) {
8792 return false ;
8893 } else if (
@@ -255,6 +260,23 @@ export default function ClashMeta_Producer() {
255260 ) ;
256261 }
257262
263+ if ( proxy . type === 'snell' ) {
264+ const shadowTLSOpts = getMihomoShadowTlsOpts ( proxy ) ;
265+ if ( shadowTLSOpts ) {
266+ proxy [ 'obfs-opts' ] = {
267+ mode : 'shadow-tls' ,
268+ host : shadowTLSOpts . host ,
269+ password : shadowTLSOpts . password ,
270+ version : shadowTLSOpts . version ,
271+ } ;
272+ if ( shadowTLSOpts . alpn ) {
273+ proxy [ 'obfs-opts' ] . alpn = shadowTLSOpts . alpn ;
274+ }
275+ delete proxy . plugin ;
276+ delete proxy [ 'plugin-opts' ] ;
277+ }
278+ }
279+
258280 if (
259281 [ 'vmess' , 'vless' ] . includes ( proxy . type ) &&
260282 proxy . network === 'http'
@@ -413,11 +435,29 @@ function isSupportedMihomoVersion(version, supportedVersions) {
413435}
414436
415437function hasMihomoShadowTls ( proxy ) {
416- return proxy ?. plugin === 'shadow-tls' ;
438+ return Boolean ( getMihomoShadowTlsOpts ( proxy ) ) ;
439+ }
440+
441+ function hasMihomoSnellShadowTlsObfsConflict ( proxy ) {
442+ return (
443+ proxy ?. type === 'snell' &&
444+ proxy ?. plugin === 'shadow-tls' &&
445+ ( isPresent ( proxy , 'obfs-opts.mode' ) ||
446+ isPresent ( proxy , 'obfs-opts.host' ) ||
447+ isPresent ( proxy , 'obfs-opts.path' ) )
448+ ) ;
417449}
418450
419451function getMihomoShadowTlsVersion ( proxy ) {
420- return proxy ?. plugin === 'shadow-tls'
421- ? proxy ?. [ 'plugin-opts' ] ?. version
422- : undefined ;
452+ return getMihomoShadowTlsOpts ( proxy ) ?. version ;
453+ }
454+
455+ function getMihomoShadowTlsOpts ( proxy ) {
456+ if ( proxy ?. plugin === 'shadow-tls' && proxy ?. [ 'plugin-opts' ] ) {
457+ return proxy [ 'plugin-opts' ] ;
458+ }
459+ if ( proxy ?. type === 'snell' && proxy ?. [ 'obfs-opts' ] ?. mode === 'shadow-tls' ) {
460+ return proxy [ 'obfs-opts' ] ;
461+ }
462+ return undefined ;
423463}
0 commit comments