This repository has been archived on 2024-09-06. You can view files and clone it, but cannot push or open issues or pull requests.
Clash.Meta/rule/common/script.go

78 lines
1.3 KiB
Go

package common
import (
"github.com/Dreamacro/clash/component/js"
C "github.com/Dreamacro/clash/constant"
"github.com/gofrs/uuid"
)
type Script struct {
*Base
adapter string
name string
}
func (s *Script) RuleType() C.RuleType {
return C.Script
}
func (s *Script) Match(metadata *C.Metadata) bool {
res := false
js.Run(s.name, map[string]any{
"metadata": C.JSRuleMetadata{
Host: metadata.Host,
Network: metadata.NetWork.String(),
Type: metadata.Type.String(),
SrcIP: metadata.SrcIP.String(),
SrcPort: metadata.SrcPort,
DstPort: metadata.DstPort,
Uid: metadata.Uid,
Process: metadata.Process,
ProcessPath: metadata.ProcessPath,
},
}, func(a any, err error) {
if err != nil {
res = false
}
r, ok := a.(bool)
if !ok {
res = false
}
res = r
})
return res
}
func (s *Script) Adapter() string {
return s.adapter
}
func (s *Script) Payload() string {
return s.adapter
}
func (s *Script) ShouldResolveIP() bool {
return false
}
func NewScript(script string, adapter string) (*Script, error) {
name, err := uuid.NewV4()
if err != nil {
return nil, err
}
if err := js.NewJS(name.String(), script); err != nil {
return nil, err
}
return &Script{
Base: &Base{},
adapter: adapter,
name: name.String(),
}, nil
}
var _ C.Rule = (*Script)(nil)