Gramjs send file in chunk

 avatar
rain
typescript
2 years ago
1.5 kB
4
Indexable
import fs from "node:fs";
import { basename } from "node:path";
import bigInt from "big-integer";
import { Api } from "telegram";
import { generateRandomBytes, readBigIntFromBuffer } from "telegram/Helpers.js";
import { getAppropriatedPartSize } from "telegram/Utils.js";
import bot from "../bot.js";

export default async function uploadFile(filePath: string): Promise<Api.InputFileBig> {
  const fileId = readBigIntFromBuffer(generateRandomBytes(8), true, true);
  const fileName = basename(filePath);
  const fileSize = fs.statSync(filePath).size;
  const defaultChunkSize = getAppropriatedPartSize(bigInt(fileSize)) * 1024;
  const fileTotalParts = Math.ceil(fileSize / defaultChunkSize);
  const file = fs.openSync(filePath, "r");

  let partCount = 0;
  let remainingSize = fileSize;

  while (remainingSize > 0) {
    const position = partCount * defaultChunkSize;
    const chunkSize = remainingSize > defaultChunkSize ? defaultChunkSize : remainingSize;
    const buffer = Buffer.alloc(chunkSize);

    remainingSize -= chunkSize;
    fs.readSync(file, buffer, { position, length: chunkSize });

    await bot.invoke(
      new Api.upload.SaveBigFilePart({
        fileId,
        filePart: partCount,
        fileTotalParts,
        bytes: buffer,
      })
    );
    partCount++;
  }
  const uploadedFile = new Api.InputFileBig({
    id: fileId,
    parts: partCount,
    name: fileName,
  });
  fs.closeSync(file);

  return uploadedFile;
}
Editor is loading...