Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
  • Loading branch information
TheodoreKrypton committed May 10, 2024
1 parent e67a524 commit b442d29
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 25 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"js-yaml": "^4.1.0",
"jsonwebtoken": "^9.0.2",
"telegraf": "^4.15.0",
"telegram": "^2.18.38",
"telegram": "^2.20.15",
"uuid": "^9.0.0",
"webdav-server": "^2.6.2",
"yargs": "^17.7.2"
Expand Down
37 changes: 19 additions & 18 deletions src/api/client/message-api/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { IBot, TDLibApi } from 'src/api/interface';
import { config } from 'src/config';
import { TechnicalError } from 'src/errors/base';
import { MessageNotFound } from 'src/errors/telegram';
import { TGFSFileVersion } from 'src/model/file';
import { manager } from 'src/server/manager';
import { Logger } from 'src/utils/logger';

Expand Down Expand Up @@ -69,13 +70,15 @@ export class MessageApi extends MessageBroker {
name,
caption,
};
const uploader = await this._uploadFile(fileMsg);
const rsp = await this.tdlib.bot.editMessageMedia({
chatId: this.privateChannelId,
messageId,
file: uploader.getUploadedFile(),
const uploader = getUploader(this.tdlib, fileMsg, async () => {
await this.tdlib.bot.editMessageMedia({
chatId: this.privateChannelId,
messageId,
file: uploader.getUploadedFile(),
});
});
return rsp.messageId;
await uploader.upload(fileMsg, MessageApi.report, fileMsg.name);
return messageId;
}

protected async pinMessage(messageId: number) {
Expand Down Expand Up @@ -125,20 +128,18 @@ export class MessageApi extends MessageBroker {
// Logger.info(`${(uploaded / totalSize) * 100}% uploaded`);
}

private async _uploadFile(fileMsg: GeneralFileMessage) {
const uploader = getUploader(this.tdlib, fileMsg);
private async _sendFile(fileMsg: GeneralFileMessage): Promise<number> {
let messageId = TGFSFileVersion.EMPTY_FILE;
const uploader = getUploader(this.tdlib, fileMsg, async () => {
messageId = (
await uploader.send(
this.privateChannelId,
MessageApi.getFileCaption(fileMsg),
)
).messageId;
});
await uploader.upload(fileMsg, MessageApi.report, fileMsg.name);
return uploader;
}

private async _sendFile(fileMsg: GeneralFileMessage): Promise<number> {
const uploader = await this._uploadFile(fileMsg);
const messageId = (
await uploader.send(
this.privateChannelId,
MessageApi.getFileCaption(fileMsg),
)
).messageId;
Logger.debug('File sent', JSON.stringify(fileMsg));
return messageId;
}
Expand Down
16 changes: 12 additions & 4 deletions src/api/client/message-api/file-uploader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export abstract class FileUploader<T extends GeneralFileMessage> {
constructor(
protected readonly client: ITDLibClient,
protected readonly fileSize: bigInt.BigInteger,
private readonly onComplete: () => Promise<void>,
) {
this.fileId = generateFileId();
this.isBig = isBig(fileSize);
Expand Down Expand Up @@ -140,6 +141,8 @@ export abstract class FileUploader<T extends GeneralFileMessage> {
try {
this.fileName = fileName ?? this.defaultFileName;

let onCompleteEmitted = false;

const createWorker = async (workerId: number): Promise<boolean> => {
try {
while (!this.done()) {
Expand All @@ -149,11 +152,15 @@ export abstract class FileUploader<T extends GeneralFileMessage> {
`[worker ${workerId}] ${this.uploaded
.multiply(100)
.divide(this.fileSize)
.toJSNumber()}% uploaded`,
.toJSNumber()}% uploaded ${this.fileId}`,
);
callback(this.uploaded, this.fileSize);
}
}
if (!onCompleteEmitted) {
onCompleteEmitted = true;
await this.onComplete();
}
return true;
} catch (err) {
this._errors[workerId] = err;
Expand Down Expand Up @@ -333,6 +340,7 @@ export class UploaderFromStream extends FileUploader<FileMessageFromStream> {
export function getUploader(
tdlib: TDLibApi,
fileMsg: GeneralFileMessage,
onComplete: () => Promise<void> = async () => {},
): FileUploader<GeneralFileMessage> {
const selectApi = (fileSize: bigInt.BigInteger) => {
// bot cannot upload files larger than 50MB
Expand All @@ -341,12 +349,12 @@ export function getUploader(

if ('path' in fileMsg) {
const fileSize = bigInt(fs.statSync(fileMsg.path).size);
return new UploaderFromPath(selectApi(fileSize), fileSize);
return new UploaderFromPath(selectApi(fileSize), fileSize, onComplete);
} else if ('buffer' in fileMsg) {
const fileSize = bigInt(fileMsg.buffer.length);
return new UploaderFromBuffer(selectApi(fileSize), fileSize);
return new UploaderFromBuffer(selectApi(fileSize), fileSize, onComplete);
} else if ('stream' in fileMsg) {
const fileSize = bigInt(fileMsg.size);
return new UploaderFromStream(selectApi(fileSize), fileSize);
return new UploaderFromStream(selectApi(fileSize), fileSize, onComplete);
}
}
2 changes: 1 addition & 1 deletion src/utils/retry.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Logger } from 'src/utils/logger';

export function retry(
retries: number = 3,
retries: number = 10,
backoff: number = 500,
): MethodDecorator {
return function (
Expand Down
2 changes: 1 addition & 1 deletion yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3578,7 +3578,7 @@ telegraf@^4.15.0:
safe-compare "^1.1.4"
sandwich-stream "^2.0.2"

telegram@^2.18.38:
telegram@^2.20.15:
version "2.20.15"
resolved "https://registry.yarnpkg.com/telegram/-/telegram-2.20.15.tgz#75193b330fd7159ccc459d5b439353ba8d23ada3"
integrity sha512-yc5ScUlg5X47z9BhGTJEaHqSYe8cGsyjUHw1+vGD2vj9ntrbp2C/YpOvP0cepTJk/k5xJ39ZJeFY0xQzkk/LMg==
Expand Down

0 comments on commit b442d29

Please sign in to comment.