{"version":3,"file":"FileChunk.mjs","sources":["../../../../../../../packages/upload-sdk/src/upload-client/split/FileChunk.ts"],"sourcesContent":["import SparkMD5 from 'spark-md5';\n\nexport interface Chunk {\n  blob: Blob; // 分片的二进制数据\n  sparkResult: any;\n  start: number; // 分片的起始位置\n  end: number; // 分片的结束位置\n  hash: string; // 分片的hash值\n  index: number; // 分片在文件中的索引\n}\n\n/**\n * 创建文件块\n *\n * 该函数的目的是将一个大文件分割成多个小块，以便于分块处理，如分块上传到服务器\n * 每个文件块包含文件的一部分，以及一些元数据，如文件块的起始位置、结束位置、哈希值和索引\n *\n * @param file 要分割的文件对象\n * @param index 当前文件块的索引，用于确定文件块在原始文件中的位置\n * @param chunkSize 文件块的大小，以字节为单位\n * @returns 返回一个包含文件块信息的对象，包括文件块的Blob对象、起始位置、结束位置、哈希值和索引\n */\nexport function createChunk(\n  file: File,\n  index: number,\n  chunkSize: number\n): Chunk {\n  // 计算文件块的起始位置\n  const start = index * chunkSize;\n  // 计算文件块的结束位置，确保不超过文件的总大小\n  const end = Math.min(start + chunkSize, file.size);\n  // 使用File对象的slice方法截取文件的一部分，生成Blob对象\n  const blob = file.slice(start, end);\n\n  // 返回包含文件块信息的对象\n  return {\n    blob,\n    start,\n    end,\n    hash: '',\n    index,\n  } as Chunk;\n}\n\n/**\n * 计算文件块的MD5哈希值\n * 此函数用于生成一个文件块的MD5哈希值，它通过使用SparkMD5库和FileReader API来实现\n * 选择使用Promise来处理异步文件读取操作，确保在文件读取完成后才计算哈希值\n *\n * @param chunk 文件块对象，包含需要计算哈希值的文件信息\n * @returns 返回一个Promise，解析为文件块的MD5哈希值字符串\n */\nexport function calcChunkHash(chunk: Chunk): Promise<string> {\n  return new Promise((resolve) => {\n    // 初始化SparkMD5实例，用于计算ArrayBuffer类型的MD5哈希值\n    const spark = new SparkMD5.ArrayBuffer();\n    // 创建FileReader实例，用于读取文件内容\n    const fileReader = new FileReader();\n    // 当文件读取完成时，处理读取结果\n    fileReader.onload = (e) => {\n      // 将读取到的文件内容追加到SparkMD5实例中\n      spark.append(e.target?.result as ArrayBuffer);\n      // 计算最终的MD5哈希值，并通过Promise解析\n      resolve(spark.end());\n    };\n    // 将文件块作为ArrayBuffer类型读取\n    fileReader.readAsArrayBuffer(chunk.blob);\n  });\n}\n\nexport function calcChunkHashAndSparkResult(chunk: Chunk) {\n  return new Promise((resolve) => {\n    // 初始化SparkMD5实例，用于计算ArrayBuffer类型的MD5哈希值\n    const spark = new SparkMD5.ArrayBuffer();\n    // 创建FileReader实例，用于读取文件内容\n    const fileReader = new FileReader();\n    // 当文件读取完成时，处理读取结果\n    fileReader.onload = (e) => {\n      // 将读取到的文件内容追加到SparkMD5实例中\n      spark.append(e.target?.result as ArrayBuffer);\n      // 计算最终的MD5哈希值，并通过Promise解析\n      resolve({\n        sparkResult: e.target?.result,\n        hash: spark.end(),\n      });\n    };\n    // 将文件块作为ArrayBuffer类型读取\n    fileReader.readAsArrayBuffer(chunk.blob);\n  });\n}\n"],"names":[],"mappings":";;AAsBgB,SAAA,WAAA,CACd,IACA,EAAA,KAAA,EACA,SACO,EAAA;AAEP,EAAA,MAAM,QAAQ,KAAQ,GAAA,SAAA,CAAA;AAEtB,EAAA,MAAM,MAAM,IAAK,CAAA,GAAA,CAAI,KAAQ,GAAA,SAAA,EAAW,KAAK,IAAI,CAAA,CAAA;AAEjD,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,EAAO,GAAG,CAAA,CAAA;AAGlC,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA;AAAA,IACA,IAAM,EAAA,EAAA;AAAA,IACN,KAAA;AAAA,GACF,CAAA;AACF,CAAA;AAUO,SAAS,cAAc,KAA+B,EAAA;AAC3D,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAE9B,IAAM,MAAA,KAAA,GAAQ,IAAI,QAAA,CAAS,WAAY,EAAA,CAAA;AAEvC,IAAM,MAAA,UAAA,GAAa,IAAI,UAAW,EAAA,CAAA;AAElC,IAAW,UAAA,CAAA,MAAA,GAAS,CAAC,CAAM,KAAA;AA3D/B,MAAA,IAAA,EAAA,CAAA;AA6DM,MAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAA,GAAA,CAAA,CAAE,MAAF,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,MAAqB,CAAA,CAAA;AAE5C,MAAQ,OAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,KACrB,CAAA;AAEA,IAAW,UAAA,CAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA,CAAA;AAAA,GACxC,CAAA,CAAA;AACH,CAAA;AAEO,SAAS,4BAA4B,KAAc,EAAA;AACxD,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAE9B,IAAM,MAAA,KAAA,GAAQ,IAAI,QAAA,CAAS,WAAY,EAAA,CAAA;AAEvC,IAAM,MAAA,UAAA,GAAa,IAAI,UAAW,EAAA,CAAA;AAElC,IAAW,UAAA,CAAA,MAAA,GAAS,CAAC,CAAM,KAAA;AA7E/B,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA+EM,MAAA,KAAA,CAAM,MAAO,CAAA,CAAA,EAAA,GAAA,CAAA,CAAE,MAAF,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,MAAqB,CAAA,CAAA;AAE5C,MAAQ,OAAA,CAAA;AAAA,QACN,WAAA,EAAA,CAAa,EAAE,GAAA,CAAA,CAAA,MAAA,KAAF,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA;AAAA,QACvB,IAAA,EAAM,MAAM,GAAI,EAAA;AAAA,OACjB,CAAA,CAAA;AAAA,KACH,CAAA;AAEA,IAAW,UAAA,CAAA,iBAAA,CAAkB,MAAM,IAAI,CAAA,CAAA;AAAA,GACxC,CAAA,CAAA;AACH;;;;"}