# Functions
CalculateShards 根据文件大小和存储选项计算数据分片和奇偶校验分片的数量 参数: - size: int64 文件大小,单位为字节 - opt: *fscfg.Options 存储选项,包含存储模式和其他参数
返回值: - int64: 数据分片数 - int64: 奇偶校验分片数 - error: 如果发生错误,返回错误信息.
CreateFileAssetRecord 创建一个新的文件资产记录 参数: - db: *badgerhold.Store 数据库实例 - fileRecord: *pb.UploadFileRecord 上传文件记录信息
返回值: - error: 如果创建过程中发生错误,返回错误信息;否则返回 nil.
CreateUploadFileRecord 创建上传文件记录并保存到数据库 该方法用于初始化一个新的文件上传记录,并将其保存到持久化存储中
参数: - db: 上传文件数据库存储接口 - taskID: 上传任务的唯一标识 - fileID: 文件的唯一标识 - name: 文件名称/路径 - fileMeta: 文件的元数据信息 - fileSecurity: 文件的安全相关信息 - status: 文件上传状态
返回值: - error: 如果创建或存储过程中发生错误则返回相应错误,否则返回 nil.
CreateUploadSegmentRecord 创建上传分片记录并保存到数据库 该方法用于初始化一个新的分片上传记录,并将其保存到持久化存储中
参数: - db: 数据库存储接口 - taskID: 上传任务的唯一标识 - segmentID: 分片的唯一标识 - index: 分片在文件中的索引位置 - size: 分片大小 - checksum: 分片的CRC32校验和 - content: 分片的加密后内容 - isRsCodes: 是否为纠删码冗余分片 - status: 分片的上传状态
返回值: - error: 如果创建或存储过程中发生错误则返回相应错误,否则返回 nil.
GetUploadProgress 获取上传任务的进度信息 参数: - db: *badgerhold.Store 数据库存储接口 - taskID: string 上传任务的唯一标识
返回值: - *bitset.BitSet: 表示上传进度的位图 - error: 如果获取过程中发生错误则返回相应错误,否则返回 nil.
HandleDeleteFileSegmentRequestPubSub 处理删除文件切片请求主题 参数: - ctx: context.Context 上下文对象,用于控制请求的生命周期 - opt: *fscfg.Options 配置选项,包含系统配置信息 - db: *database.DB 数据库实例,用于数据持久化 - fs: afero.Afero 文件系统实例,用于文件操作 - nps: *pubsub.NodePubSub 发布订阅系统,用于消息通信 - upload: *UploadManager 上传管理器实例,处理上传相关逻辑 - res: *pubsub.Message 接收到的消息,包含请求数据
返回值: - error 返回处理过程中的错误信息
功能: - 处理删除文件切片信息的请求 - 解析请求数据并删除对应的文件切片存储记录.
InitializeUploadManager 初始化 UploadManager 并设置相关的生命周期钩子 参数: - lc: fx.Lifecycle 用于管理应用生命周期的对象 - input: InitializeUploadManagerInput 包含初始化 UploadManager 所需的输入参数
返回值: - error 如果初始化过程中发生错误,则返回相应的错误信息.
NewFileMeta 创建并初始化一个新的 FileMeta 实例,提供文件的基本元数据信息 参数: - file: *os.File 文件对象,用于读取文件信息
返回值: - *pb.FileMeta: 新创建的 FileMeta 实例,包含文件的基本元数据 - error: 如果发生错误,返回错误信息.
NewFileSecurity 创建并初始化一个新的FileSecurity实例,封装了文件的安全和权限相关的信息 参数: - fileID: string 文件ID - privKey: *ecdsa.PrivateKey 私钥 - secret: []byte 需要共享的秘密
返回: - *pb.FileSecurity: 包含文件安全信息的结构体 - error: 错误信息.
NewFileSegment 创建并初始化一个新的 FileSegment 实例,提供分片的详细信息及其上传状态。 参数: - db: *badgerhold.Store 数据库实例 - taskID: string 任务ID,用于标识上传任务 - fileID: string 文件ID,用于标识文件 - file: *os.File 待处理的文件对象 - pk: []byte 用于加密的公钥 - dataShards: int64 数据分片数量 - parityShards: int64 奇偶校验分片数量
返回值: - error: 如果发生错误,返回错误信息.
NewSegmentStatus 初始化并返回一个 SegmentStatus 实例 参数: - locker: sync.Locker 用于同步的互斥锁
返回值: - *SegmentStatus: 初始化后的 SegmentStatus 实例.
NewUploadFile 创建并初始化一个新的 UploadFile 实例 参数: - opt: *fscfg.Options 存储选项 - db: *database.DB 数据库实例 - scheme: *shamir.ShamirScheme Shamir 秘密共享方案 - name: string 文件名 - ownerPriv: *ecdsa.PrivateKey 文件所有者的私钥 - onSegmentsReady: func(taskID string) 完成回调函数
返回值: - *pb.UploadOperationInfo: 上传操作信息 - error: 错误信息.
NewUploadManager 创建并初始化一个新的 UploadManager 实例 参数: - lc: fx.Lifecycle 用于管理应用生命周期的对象 - input: NewUploadManagerInput 包含创建 UploadManager 所需的输入参数
返回值: - out: NewUploadManagerOutput 包含创建的 UploadManager 实例 - err: error 如果创建过程中发生错误,则返回相应的错误信息.
NewUploadTask 创建并初始化一个新的文件上传任务实例 参数: - ctx: context.Context 用于管理任务生命周期的上下文 - opt: *fscfg.Options 文件存储配置选项 - db: *database.DB 数据库实例 - fs: afero.Afero 文件系统接口 - host: host.Host libp2p网络主机实例 - routingTable: *kbucket.RoutingTable 路由表 - nps: *pubsub.NodePubSub 发布订阅系统 - scheme: *shamir.ShamirScheme Shamir秘密共享方案实例 - statusChan: chan *pb.UploadChan 状态更新通道 - taskID: string 任务唯一标识符
返回值: - *UploadTask: 创建的上传任务实例.
ProcessFileSegments 异步处理文件分片 该方法会在后台进行文件的分片、编码和存储操作
参数: - db: *badgerhold.Store 数据库实例 - taskID: string 任务ID - fileID: string 文件ID - file: *os.File 文件对象 - pk: []byte 用于加密的公钥 - dataShards: int64 数据分片数 - parityShards: int64 奇偶校验分片数 - onComplete: func() 完成回调函数.
QueryFileAssets 查询文件资产记录 参数: - db: BadgerDB存储实例,用于数据持久化 - pubkeyHash: 所有者的公钥哈希,用于权限验证 - start: 起始记录索引 - pageSize: 每页的最大记录数 - query: 查询条件字符串 - options: 额外的查询选项,用于设置查询条件
返回值: - []*pb.FileAssetRecord: 查询到的文件资产记录切片 - uint64: 符合查询条件的总记录数 - int: 当前页数 - int: 每页的最大记录数 - error: 如果查询过程中发生错误,返回错误信息.
RegisterUploadPubsubProtocol 注册所有上传相关的PubSub协议处理器 参数: - lc: fx.Lifecycle 应用生命周期管理器 - input: RegisterPubsubProtocolInput 注册所需的输入参数
返回值: - error: 如果注册过程中出现错误,返回相应的错误信息.
RegisterUploadStreamProtocol 注册上传流协议 参数: - lc: fx.Lifecycle 类型,用于管理组件的生命周期 - input: RegisterStreamProtocolInput 类型,包含注册所需的所有依赖项
返回值: 无.
RequestDeleteFileSegmentPubSub 发送删除文件片段请求 参数: - ctx: 上下文,用于控制请求的生命周期 - nps: 发布订阅系统,用于节点之间的消息传递 - fileID: 文件唯一标识 - pubkeyHash: 所有者的公钥哈希
返回值: - error: 如果请求过程中出现错误,返回相应的错误信息.
UpdateSegmentUploadInfo 更新文件片段的上传信息 该方法用于更新文件片段的上传状态、节点ID和上传时间
参数: - db: *badgerhold.Store 数据库存储接口 - taskID: string 上传任务的唯一标识 - index: int64 片段索引 - status: pb.SegmentUploadStatus 片段上传状态
返回值: - error: 如果更新过程中发生错误则返回相应错误,否则返回 nil.
UpdateUploadFileHashTable 更新上传文件的哈希表 该方法仅在文件处于编码状态时更新哈希表,并将状态改为待上传 参数: - db: *badgerhold.Store 数据库存储接口 - taskID: string 上传任务的唯一标识 - sliceTable: map[int64]*pb.HashTable 分片哈希表
返回值: - error: 如果更新过程中发生错误则返回相应错误,否则返回 nil.
UpdateUploadFileStatus 更新上传文件的状态 参数: - db: *badgerhold.Store 数据库存储接口 - taskID: string 上传任务的唯一标识 - status: pb.UploadStatus 新的文件状态
返回值: - error: 如果更新过程中发生错误则返回相应错误,否则返回 nil.
ValidateAndUpdateUploadStatus 校验并更新上传状态 该方法用于开始上传前的状态校验,会根据实际进度强制更新任务状态: 1.
# Variables
AllowedTopics 定义了系统支持的所有主题列表.
StreamForwardToNetworkProtocol 定义了转发任务到网络的协议标识符.
StreamSendingToNetworkProtocol 定义了发送任务到网络的协议标识符.
# Structs
InitializeUploadManagerInput 定义了初始化 UploadManager 所需的输入参数.
NewUploadManagerInput 定义了创建 UploadManager 所需的输入参数.
NewUploadManagerOutput 定义了 NewUploadManager 函数的输出.
RegisterPubsubProtocolInput 定义了注册PubsubProtocol所需的输入参数.
RegisterStreamProtocolInput 定义了注册流协议所需的输入参数.
SegmentStatus 用于跟踪文件是否准备就绪的状态.
StreamProtocol 定义了流协议的结构体.
UploadManager 管理所有上传任务,提供文件上传的统一入口和管理功能 它负责协调上传任务的执行,管理任务的生命周期,以及通知任务的状态更新和错误事件.
UploadTask 描述一个文件上传任务,包括文件信息和上传状态.
# Type aliases
Topic 定义了允许的主题类型.