using Dpz.Core.Web.Jobs.Models.FileTransfer;

namespace Dpz.Core.Web.Jobs.Services.FileTransfer;

/// <summary>
/// 文件传输房间的内存存储接口。只保存连接元数据,不保存文件内容。
/// </summary>
public interface IFileTransferRoomStore
{
    /// <summary>未配对房间的最大存活时间。</summary>
    TimeSpan PendingRoomLifetime { get; }

    /// <summary>创建房间并绑定发起方连接。</summary>
    /// <param name="connectionId">发起方的 SignalR 连接 ID。</param>
    /// <param name="joinUrl">接收方加入链接。</param>
    /// <returns>包含房间对象和快照的操作结果。</returns>
    FileTransferRoomResult CreateRoom(string connectionId, string joinUrl);

    /// <summary>尝试接收方加入已有房间。</summary>
    /// <param name="roomKey">房间 Key。</param>
    /// <param name="connectionId">接收方的 SignalR 连接 ID。</param>
    /// <param name="joinUrl">接收方加入链接。</param>
    /// <returns>包含房间对象和快照的操作结果。</returns>
    FileTransferOperationResult<FileTransferRoomResult> TryJoinRoom(
        string roomKey,
        string connectionId,
        string joinUrl
    );

    /// <summary>尝试获取房间。</summary>
    /// <param name="roomKey">房间 Key。</param>
    /// <returns>房间对象操作结果。</returns>
    FileTransferOperationResult<FileTransferRoom> TryGetRoom(string roomKey);

    /// <summary>根据连接 ID 查找房间。</summary>
    /// <param name="connectionId">SignalR 连接 ID。</param>
    /// <returns>房间对象,未找到时返回 null。</returns>
    FileTransferRoom? GetRoomByConnection(string connectionId);

    /// <summary>移除指定连接关联的房间。</summary>
    /// <param name="connectionId">SignalR 连接 ID。</param>
    /// <returns>被移除的房间对象,未找到时返回 null。</returns>
    FileTransferRoom? RemoveByConnection(string connectionId);

    /// <summary>直接移除指定房间。</summary>
    /// <param name="roomKey">房间 Key。</param>
    /// <returns>被移除的房间对象,未找到时返回 null。</returns>
    FileTransferRoom? RemoveRoom(string roomKey);

    /// <summary>移除所有已过期的未配对房间。</summary>
    /// <param name="now">当前时间。</param>
    /// <returns>被移除的房间列表。</returns>
    IReadOnlyList<FileTransferRoom> RemoveExpiredPendingRooms(DateTimeOffset now);
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码说明

这是一个 文件传输房间内存存储接口 的定义文件,用于管理文件传输会话的元数据。

核心功能

该接口 IFileTransferRoomStore 定义了一个文件传输房间管理系统,用于协调文件发送方和接收方之间的连接配对。

关键设计理念

  • 只存储元数据:不保存实际文件内容,仅管理连接信息
  • 房间机制:使用"房间"概念来匹配发送方和接收方
  • 生命周期管理:对未配对的房间设置过期时间

主要方法说明

1. PendingRoomLifetime

  • 未配对房间的最大存活时间配置
  • 用于自动清理长期未匹配的房间

2. CreateRoom

  • 发送方创建房间并获得房间标识
  • 绑定发送方的 SignalR 连接 ID
  • 返回包含加入 URL 的房间信息

3. TryJoinRoom

  • 接收方通过房间 Key 加入房间
  • 完成发送方与接收方的配对
  • 返回操作结果(成功/失败)

4. TryGetRoom

  • 根据房间 Key 查询房间信息
  • 用于验证房间是否存在

5. GetRoomByConnection

  • 通过 SignalR 连接 ID 反向查找房间
  • 用于处理连接断开等事件

6. RemoveByConnection / RemoveRoom

  • 根据连接 ID 或房间 Key 删除房间
  • 用于清理已完成或取消的传输会话

7. RemoveExpiredPendingRooms

  • 定期清理过期的未配对房间
  • 释放系统资源,防止内存泄漏

应用场景

典型的文件传输流程:

  1. 发送方创建房间 → 获得分享链接
  2. 接收方通过链接加入房间 → 配对成功
  3. 双方通过 SignalR 实时传输文件
  4. 传输完成或断开后清理房间

这是一个基于 SignalR 的实时文件传输系统的核心接口定义。

评论加载中...