//go:build linux || (darwin && amd64) package mount import ( fusefs "github.com/hanwen/go-fuse/v2/fs" "github.com/hanwen/go-fuse/v2/fuse" cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" "gitlink.org.cn/cloudream/common/utils/sync2" "gitlink.org.cn/cloudream/storage/client2/internal/mount/config" fuse2 "gitlink.org.cn/cloudream/storage/client2/internal/mount/fuse" "gitlink.org.cn/cloudream/storage/client2/internal/mount/vfs" "gitlink.org.cn/cloudream/storage/common/pkgs/db2" "gitlink.org.cn/cloudream/storage/common/pkgs/downloader" ) type MountEvent interface { IsMountEvent() bool } type MountExitEvent struct { MountEvent } type MountingFailedEvent struct { MountEvent Err error } type Mount struct { cfg *config.Config vfs *vfs.Vfs fuse *fuse2.Fuse } func NewMount(cfg *config.Config, db *db2.DB, downloader *downloader.Downloader) *Mount { vfs := vfs.NewVfs(cfg, db, downloader) fuse := fuse2.NewFuse(cfg, vfs) return &Mount{ cfg: cfg, vfs: vfs, fuse: fuse, } } func (m *Mount) Start() *sync2.UnboundChannel[MountEvent] { ch := sync2.NewUnboundChannel[MountEvent]() go func() { nodeFsOpt := &fusefs.Options{ MountOptions: fuse.MountOptions{ FsName: "CDS", }, } rawFs := fusefs.NewNodeFS(m.fuse.Root(), nodeFsOpt) svr, err := fuse.NewServer(rawFs, m.cfg.MountPoint, &nodeFsOpt.MountOptions) if err != nil { ch.Send(MountingFailedEvent{Err: err}) return } svr.Serve() ch.Send(MountExitEvent{}) }() return ch } func (m *Mount) NotifyObjectInvalid(obj cdssdk.Object) { } func (m *Mount) NotifyPackageInvalid(pkg cdssdk.Package) { } func (m *Mount) NotifyBucketInvalid(bkt cdssdk.Bucket) { }