JCS-pub/agent/internal/task/ipfs_read.go

126 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package task
import (
"fmt"
"io"
"os"
"path/filepath"
"time"
"gitlink.org.cn/cloudream/common/pkgs/logger"
"gitlink.org.cn/cloudream/common/pkgs/task"
stgglb "gitlink.org.cn/cloudream/storage/common/globals"
)
// IPFSRead 代表从IPFS读取文件的任务
type IPFSRead struct {
FileHash string // 文件的IPFS哈希值
LocalPath string // 本地存储路径
}
// NewIPFSRead 创建一个新的IPFS读取任务实例
func NewIPFSRead(fileHash string, localPath string) *IPFSRead {
return &IPFSRead{
FileHash: fileHash,
LocalPath: localPath,
}
}
// Compare 比较当前任务与另一个任务是否相同
// other: 要比较的另一个任务
// 返回值: 如果两个任务相同返回true否则返回false
func (t *IPFSRead) Compare(other *Task) bool {
tsk, ok := other.Body().(*IPFSRead)
if !ok {
return false
}
return t.FileHash == tsk.FileHash && t.LocalPath == tsk.LocalPath
}
// Execute 执行从IPFS读取文件并存储到本地的任务
// task: 任务实例
// ctx: 任务上下文
// complete: 任务完成的回调函数
func (t *IPFSRead) Execute(task *task.Task[TaskContext], ctx TaskContext, complete CompleteFn) {
// 初始化日志
log := logger.WithType[IPFSRead]("Task")
log.Debugf("begin with %v", logger.FormatStruct(t))
defer log.Debugf("end")
// 获取输出文件的目录并创建该目录
outputFileDir := filepath.Dir(t.LocalPath)
// 创建输出文件的目录
err := os.MkdirAll(outputFileDir, os.ModePerm)
if err != nil {
// 目录创建失败的处理
err := fmt.Errorf("create output file directory %s failed, err: %w", outputFileDir, err)
log.WithField("LocalPath", t.LocalPath).Warn(err.Error())
complete(err, CompleteOption{
RemovingDelay: time.Minute,
})
return
}
// 创建输出文件
outputFile, err := os.Create(t.LocalPath)
if err != nil {
// 输出文件创建失败的处理
err := fmt.Errorf("create output file %s failed, err: %w", t.LocalPath, err)
log.WithField("LocalPath", t.LocalPath).Warn(err.Error())
complete(err, CompleteOption{
RemovingDelay: time.Minute,
})
return
}
defer outputFile.Close()
// 获取IPFS客户端
ipfsCli, err := stgglb.IPFSPool.Acquire()
if err != nil {
// 获取IPFS客户端失败的处理
err := fmt.Errorf("new ipfs client: %w", err)
log.Warn(err.Error())
complete(err, CompleteOption{
RemovingDelay: time.Minute,
})
return
}
defer ipfsCli.Close()
// 打开IPFS中的文件进行读取
rd, err := ipfsCli.OpenRead(t.FileHash)
if err != nil {
// 打开IPFS文件失败的处理
err := fmt.Errorf("read ipfs file failed, err: %w", err)
log.WithField("FileHash", t.FileHash).Warn(err.Error())
complete(err, CompleteOption{
RemovingDelay: time.Minute,
})
return
}
// 将IPFS文件内容复制到本地文件
_, err = io.Copy(outputFile, rd)
if err != nil {
// 文件复制失败的处理
err := fmt.Errorf("copy ipfs file to local file failed, err: %w", err)
log.WithField("LocalPath", t.LocalPath).Warn(err.Error())
complete(err, CompleteOption{
RemovingDelay: time.Minute,
})
return
}
// 任务完成,调用回调函数
complete(nil, CompleteOption{
RemovingDelay: time.Minute,
})
}