diff --git a/.prettierignore b/.prettierignore index f1810c69..f10491ea 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,3 +6,6 @@ src/tl/types.d.ts src/tl/types.js src/tl/binary/reader.js src/tl/binary/writer.js + +**/dist +*.d.ts diff --git a/package.json b/package.json index d5b0bf13..76c5de73 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,9 @@ "license": "LGPL-3.0", "author": "Alisa Sireneva ", "scripts": { - "test": "lerna run test", - "build": "lerna run build", - "lint": "eslint packages/**/*.ts", - "format": "prettier --write packages/**/*.ts", + "test-all": "pnpm run -r test", + "lint": "eslint \"packages/**/*.ts\"", + "format": "prettier --write \"packages/**/*.ts\"", "publish-all": "node scripts/publish.js all" }, "dependencies": { @@ -29,9 +28,9 @@ "mocha": "^9.2.2", "node-forge": "^1.3.1", "prettier": "^2.6.2", - "ts-node": "^10.7.0", - "typedoc": "^0.22.15", - "typescript": "^4.6.4", + "ts-node": "^10.8.1", + "typedoc": "^0.23.2", + "typescript": "^4.7.4", "nyc": "^15.1.0", "rimraf": "^3.0.2", "dotenv-flow": "^3.2.0", diff --git a/packages/client/package.json b/packages/client/package.json index 71843409..6ee81ac6 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -7,7 +7,7 @@ "license": "LGPL-3.0", "main": "src/index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts index b94c51be..7c9237be 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -3,7 +3,7 @@ export { JsonFileStorage, LocalstorageStorage, tl, - defaultDcs + defaultDcs, } from '@mtcute/core' export * from './types' diff --git a/packages/client/src/methods/auth/check-password.ts b/packages/client/src/methods/auth/check-password.ts index 9b41ffd8..d76a00e9 100644 --- a/packages/client/src/methods/auth/check-password.ts +++ b/packages/client/src/methods/auth/check-password.ts @@ -1,6 +1,7 @@ +import { computeSrpParams } from '@mtcute/core' + import { TelegramClient } from '../../client' import { User } from '../../types' -import { computeSrpParams } from '@mtcute/core' import { assertTypeIs } from '../../utils/type-assertion' /** diff --git a/packages/client/src/methods/auth/log-out.ts b/packages/client/src/methods/auth/log-out.ts index 1e14772a..0f8d2636 100644 --- a/packages/client/src/methods/auth/log-out.ts +++ b/packages/client/src/methods/auth/log-out.ts @@ -9,9 +9,7 @@ import { TelegramClient } from '../../client' * @returns On success, `true` is returned * @internal */ -export async function logOut( - this: TelegramClient -): Promise { +export async function logOut(this: TelegramClient): Promise { await this.call({ _: 'auth.logOut' }) this._userId = null diff --git a/packages/client/src/methods/auth/resend-code.ts b/packages/client/src/methods/auth/resend-code.ts index d78d7ac2..63853b4a 100644 --- a/packages/client/src/methods/auth/resend-code.ts +++ b/packages/client/src/methods/auth/resend-code.ts @@ -1,5 +1,5 @@ -import { SentCode } from '../../types' import { TelegramClient } from '../../client' +import { SentCode } from '../../types' import { normalizePhoneNumber } from '../../utils/misc-utils' /** diff --git a/packages/client/src/methods/auth/send-code.ts b/packages/client/src/methods/auth/send-code.ts index 2845d65d..22ad5766 100644 --- a/packages/client/src/methods/auth/send-code.ts +++ b/packages/client/src/methods/auth/send-code.ts @@ -1,5 +1,5 @@ -import { SentCode } from '../../types' import { TelegramClient } from '../../client' +import { SentCode } from '../../types' import { normalizePhoneNumber } from '../../utils/misc-utils' /** diff --git a/packages/client/src/methods/auth/sign-in-bot.ts b/packages/client/src/methods/auth/sign-in-bot.ts index 4d70a967..69cf97cd 100644 --- a/packages/client/src/methods/auth/sign-in-bot.ts +++ b/packages/client/src/methods/auth/sign-in-bot.ts @@ -1,5 +1,5 @@ -import { User } from '../../types' import { TelegramClient } from '../../client' +import { User } from '../../types' import { assertTypeIs } from '../../utils/type-assertion' /** diff --git a/packages/client/src/methods/auth/sign-in.ts b/packages/client/src/methods/auth/sign-in.ts index 8e672167..2f31b8cf 100644 --- a/packages/client/src/methods/auth/sign-in.ts +++ b/packages/client/src/methods/auth/sign-in.ts @@ -1,5 +1,5 @@ -import { User, TermsOfService } from '../../types' import { TelegramClient } from '../../client' +import { User, TermsOfService } from '../../types' import { assertTypeIs } from '../../utils/type-assertion' import { normalizePhoneNumber } from '../../utils/misc-utils' diff --git a/packages/client/src/methods/auth/sign-up.ts b/packages/client/src/methods/auth/sign-up.ts index 24437544..74bcdf11 100644 --- a/packages/client/src/methods/auth/sign-up.ts +++ b/packages/client/src/methods/auth/sign-up.ts @@ -1,7 +1,7 @@ import { TelegramClient } from '../../client' +import { User } from '../../types' import { normalizePhoneNumber } from '../../utils/misc-utils' import { assertTypeIs } from '../../utils/type-assertion' -import { User } from '../../types' /** * Register a new user in Telegram. diff --git a/packages/client/src/methods/auth/start-test.ts b/packages/client/src/methods/auth/start-test.ts index 4c7d148b..73e2fc82 100644 --- a/packages/client/src/methods/auth/start-test.ts +++ b/packages/client/src/methods/auth/start-test.ts @@ -1,5 +1,5 @@ -import { MaybeDynamic, MtArgumentError, User } from '../../types' import { TelegramClient } from '../../client' +import { MaybeDynamic, MtArgumentError, User } from '../../types' /** * Utility function to quickly authorize on test DC diff --git a/packages/client/src/methods/auth/start.ts b/packages/client/src/methods/auth/start.ts index 383edd08..8561e0ee 100644 --- a/packages/client/src/methods/auth/start.ts +++ b/packages/client/src/methods/auth/start.ts @@ -1,3 +1,6 @@ +import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { MaybeDynamic, MtArgumentError, @@ -6,12 +9,10 @@ import { User, MaybeAsync, } from '../../types' -import { TelegramClient } from '../../client' import { resolveMaybeDynamic, normalizePhoneNumber, } from '../../utils/misc-utils' -import { tl } from '@mtcute/tl' /** * Start the client in an interactive and declarative manner, diff --git a/packages/client/src/methods/bots/answer-callback-query.ts b/packages/client/src/methods/bots/answer-callback-query.ts index 2d760a78..a3889c77 100644 --- a/packages/client/src/methods/bots/answer-callback-query.ts +++ b/packages/client/src/methods/bots/answer-callback-query.ts @@ -1,6 +1,7 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' + /** * Send an answer to a callback query. * diff --git a/packages/client/src/methods/bots/answer-inline-query.ts b/packages/client/src/methods/bots/answer-inline-query.ts index 347a19c7..694ac636 100644 --- a/packages/client/src/methods/bots/answer-inline-query.ts +++ b/packages/client/src/methods/bots/answer-inline-query.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { BotInline, InputInlineResult } from '../../types' /** diff --git a/packages/client/src/methods/bots/delete-my-commands.ts b/packages/client/src/methods/bots/delete-my-commands.ts index aaa653a1..58344823 100644 --- a/packages/client/src/methods/bots/delete-my-commands.ts +++ b/packages/client/src/methods/bots/delete-my-commands.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { BotCommands } from '../../types' /** diff --git a/packages/client/src/methods/bots/get-bot-menu-button.ts b/packages/client/src/methods/bots/get-bot-menu-button.ts index 0f27a4a2..06ef04c7 100644 --- a/packages/client/src/methods/bots/get-bot-menu-button.ts +++ b/packages/client/src/methods/bots/get-bot-menu-button.ts @@ -1,7 +1,8 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' -import { InputPeerLike, MtInvalidPeerTypeError } from "../../types"; -import { normalizeToInputUser } from "../../utils/peer-utils"; + +import { TelegramClient } from '../../client' +import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' +import { normalizeToInputUser } from '../../utils/peer-utils' /** * Fetches the menu button set for the given user. diff --git a/packages/client/src/methods/bots/get-callback-answer.ts b/packages/client/src/methods/bots/get-callback-answer.ts index cc01c433..13030a9a 100644 --- a/packages/client/src/methods/bots/get-callback-answer.ts +++ b/packages/client/src/methods/bots/get-callback-answer.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' -import { InputPeerLike } from '../../types' import { tl } from '@mtcute/tl' import { computeSrpParams } from '@mtcute/core' +import { TelegramClient } from '../../client' +import { InputPeerLike } from '../../types' + /** * Request a callback answer from a bot, * i.e. click an inline button that contains data. diff --git a/packages/client/src/methods/bots/get-game-high-scores.ts b/packages/client/src/methods/bots/get-game-high-scores.ts index 05715de7..31ecd04c 100644 --- a/packages/client/src/methods/bots/get-game-high-scores.ts +++ b/packages/client/src/methods/bots/get-game-high-scores.ts @@ -1,3 +1,5 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike, @@ -5,7 +7,6 @@ import { GameHighScore, PeersIndex, } from '../../types' -import { tl } from '@mtcute/tl' import { normalizeToInputUser } from '../../utils/peer-utils' /** diff --git a/packages/client/src/methods/bots/get-my-commands.ts b/packages/client/src/methods/bots/get-my-commands.ts index f4cf5c4b..d00000cc 100644 --- a/packages/client/src/methods/bots/get-my-commands.ts +++ b/packages/client/src/methods/bots/get-my-commands.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { BotCommands } from '../../types' /** diff --git a/packages/client/src/methods/bots/normalize-command-scope.ts b/packages/client/src/methods/bots/normalize-command-scope.ts index 7b6b7e83..0575304d 100644 --- a/packages/client/src/methods/bots/normalize-command-scope.ts +++ b/packages/client/src/methods/bots/normalize-command-scope.ts @@ -1,9 +1,10 @@ import { tl } from '@mtcute/tl' -import { BotCommands, MtInvalidPeerTypeError } from '../../types' -import { TelegramClient } from '../../client' -import { normalizeToInputUser } from '../../utils/peer-utils' import { assertNever } from '@mtcute/core' +import { TelegramClient } from '../../client' +import { BotCommands, MtInvalidPeerTypeError } from '../../types' +import { normalizeToInputUser } from '../../utils/peer-utils' + /** @internal */ export async function _normalizeCommandScope( this: TelegramClient, @@ -17,21 +18,25 @@ export async function _normalizeCommandScope( const peer = await this.resolvePeer(scope.peer) return { - _: scope.type === 'peer' ? 'botCommandScopePeer' : 'botCommandScopePeerAdmins', - peer + _: + scope.type === 'peer' + ? 'botCommandScopePeer' + : 'botCommandScopePeerAdmins', + peer, } } case 'member': { const chat = await this.resolvePeer(scope.chat) - const user = normalizeToInputUser(await this.resolvePeer(scope.user)) + const user = normalizeToInputUser( + await this.resolvePeer(scope.user) + ) - if (!user) - throw new MtInvalidPeerTypeError(scope.user, 'user') + if (!user) throw new MtInvalidPeerTypeError(scope.user, 'user') return { _: 'botCommandScopePeerUser', peer: chat, - userId: user + userId: user, } } default: diff --git a/packages/client/src/methods/bots/set-bot-menu-button.ts b/packages/client/src/methods/bots/set-bot-menu-button.ts index 15f67c7c..f49740d2 100644 --- a/packages/client/src/methods/bots/set-bot-menu-button.ts +++ b/packages/client/src/methods/bots/set-bot-menu-button.ts @@ -1,7 +1,8 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' -import { InputPeerLike, MtInvalidPeerTypeError } from "../../types"; -import { normalizeToInputUser } from "../../utils/peer-utils"; + +import { TelegramClient } from '../../client' +import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' +import { normalizeToInputUser } from '../../utils/peer-utils' /** * Sets a menu button for the given user. @@ -21,6 +22,6 @@ export async function setBotMenuButton( await this.call({ _: 'bots.setBotMenuButton', userId, - button + button, }) } diff --git a/packages/client/src/methods/bots/set-game-score.ts b/packages/client/src/methods/bots/set-game-score.ts index 0b17148e..268b9e2a 100644 --- a/packages/client/src/methods/bots/set-game-score.ts +++ b/packages/client/src/methods/bots/set-game-score.ts @@ -1,8 +1,9 @@ -import { InputPeerLike, Message, MtInvalidPeerTypeError } from '../../types' -import { TelegramClient } from '../../client' -import { normalizeToInputUser } from '../../utils/peer-utils' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' +import { InputPeerLike, Message, MtInvalidPeerTypeError } from '../../types' +import { normalizeToInputUser } from '../../utils/peer-utils' + /** * Set a score of a user in a game * diff --git a/packages/client/src/methods/bots/set-my-commands.ts b/packages/client/src/methods/bots/set-my-commands.ts index a13298e2..8b65040e 100644 --- a/packages/client/src/methods/bots/set-my-commands.ts +++ b/packages/client/src/methods/bots/set-my-commands.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { BotCommands } from '../../types' /** diff --git a/packages/client/src/methods/bots/set-my-default-rights.ts b/packages/client/src/methods/bots/set-my-default-rights.ts index 37898f6f..dc3a14b3 100644 --- a/packages/client/src/methods/bots/set-my-default-rights.ts +++ b/packages/client/src/methods/bots/set-my-default-rights.ts @@ -1,6 +1,7 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' + /** * Sets the default chat permissions for the bot in the supergroup or channel. * @@ -14,10 +15,13 @@ export async function setMyDefaultRights( rights: Omit ): Promise { await this.call({ - _: target === 'group' ? 'bots.setBotGroupDefaultAdminRights' : 'bots.setBotBroadcastDefaultAdminRights', + _: + target === 'group' + ? 'bots.setBotGroupDefaultAdminRights' + : 'bots.setBotBroadcastDefaultAdminRights', adminRights: { _: 'chatAdminRights', - ...rights + ...rights, }, }) } diff --git a/packages/client/src/methods/chats/add-chat-members.ts b/packages/client/src/methods/chats/add-chat-members.ts index 2ed9caf6..5be289fe 100644 --- a/packages/client/src/methods/chats/add-chat-members.ts +++ b/packages/client/src/methods/chats/add-chat-members.ts @@ -1,6 +1,7 @@ +import { MaybeArray } from '@mtcute/core' + import { TelegramClient } from '../../client' import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' -import { MaybeArray } from '@mtcute/core' import { isInputPeerChannel, isInputPeerChat, diff --git a/packages/client/src/methods/chats/archive-chats.ts b/packages/client/src/methods/chats/archive-chats.ts index b6746fb3..b7eb12de 100644 --- a/packages/client/src/methods/chats/archive-chats.ts +++ b/packages/client/src/methods/chats/archive-chats.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' import { MaybeArray } from '@mtcute/core' -import { InputPeerLike } from '../../types' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' +import { InputPeerLike } from '../../types' + /** * Archive one or more chats * diff --git a/packages/client/src/methods/chats/create-group.ts b/packages/client/src/methods/chats/create-group.ts index 8bd6aa19..ef3d2031 100644 --- a/packages/client/src/methods/chats/create-group.ts +++ b/packages/client/src/methods/chats/create-group.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { MaybeArray } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { Chat, InputPeerLike } from '../../types' import { normalizeToInputUser } from '../../utils/peer-utils' import { assertIsUpdatesGroup } from '../../utils/updates-utils' diff --git a/packages/client/src/methods/chats/delete-channel.ts b/packages/client/src/methods/chats/delete-channel.ts index 55453912..5ceef901 100644 --- a/packages/client/src/methods/chats/delete-channel.ts +++ b/packages/client/src/methods/chats/delete-channel.ts @@ -1,5 +1,5 @@ -import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' import { TelegramClient } from '../../client' +import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' import { normalizeToInputChannel } from '../../utils/peer-utils' // @alias=deleteSupergroup diff --git a/packages/client/src/methods/chats/delete-group.ts b/packages/client/src/methods/chats/delete-group.ts index 827954e6..353df836 100644 --- a/packages/client/src/methods/chats/delete-group.ts +++ b/packages/client/src/methods/chats/delete-group.ts @@ -13,8 +13,7 @@ export async function deleteGroup( chatId: InputPeerLike ): Promise { const chat = await this.resolvePeer(chatId) - if (!isInputPeerChat(chat)) - throw new MtInvalidPeerTypeError(chatId, 'chat') + if (!isInputPeerChat(chat)) throw new MtInvalidPeerTypeError(chatId, 'chat') const res = await this.call({ _: 'messages.deleteChatUser', diff --git a/packages/client/src/methods/chats/delete-history.ts b/packages/client/src/methods/chats/delete-history.ts index 5769f3f5..b78545d2 100644 --- a/packages/client/src/methods/chats/delete-history.ts +++ b/packages/client/src/methods/chats/delete-history.ts @@ -1,8 +1,9 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike } from '../../types' import { normalizeToInputChannel } from '../../utils/peer-utils' import { createDummyUpdate } from '../../utils/updates-utils' -import { tl } from '@mtcute/tl' /** * Delete communication history (for private chats diff --git a/packages/client/src/methods/chats/delete-user-history.ts b/packages/client/src/methods/chats/delete-user-history.ts index 48d6d804..5bf4af5d 100644 --- a/packages/client/src/methods/chats/delete-user-history.ts +++ b/packages/client/src/methods/chats/delete-user-history.ts @@ -1,10 +1,11 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' import { normalizeToInputChannel, normalizeToInputPeer, } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' import { createDummyUpdate } from '../../utils/updates-utils' /** diff --git a/packages/client/src/methods/chats/edit-admin-rights.ts b/packages/client/src/methods/chats/edit-admin-rights.ts index db4b46d9..505e294e 100644 --- a/packages/client/src/methods/chats/edit-admin-rights.ts +++ b/packages/client/src/methods/chats/edit-admin-rights.ts @@ -1,6 +1,7 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' -import { tl } from '@mtcute/tl' import { normalizeToInputChannel, normalizeToInputUser, diff --git a/packages/client/src/methods/chats/get-chat-event-log.ts b/packages/client/src/methods/chats/get-chat-event-log.ts index 8452eb7c..08722bb2 100644 --- a/packages/client/src/methods/chats/get-chat-event-log.ts +++ b/packages/client/src/methods/chats/get-chat-event-log.ts @@ -1,16 +1,18 @@ +import Long from 'long' +import { tl } from '@mtcute/tl' +import { assertNever, MaybeArray } from '@mtcute/core' + import { TelegramClient } from '../../client' import { InputPeerLike, MtInvalidPeerTypeError, - ChatEvent, PeersIndex, + ChatEvent, + PeersIndex, } from '../../types' -import { tl } from '@mtcute/tl' -import { assertNever, MaybeArray } from "@mtcute/core"; import { normalizeToInputChannel, normalizeToInputUser, } from '../../utils/peer-utils' -import Long from 'long' /** * Get chat event log ("Recent actions" in official diff --git a/packages/client/src/methods/chats/get-chat-member.ts b/packages/client/src/methods/chats/get-chat-member.ts index 98d8d4b2..c284279d 100644 --- a/packages/client/src/methods/chats/get-chat-member.ts +++ b/packages/client/src/methods/chats/get-chat-member.ts @@ -1,3 +1,5 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike, MtInvalidPeerTypeError, PeersIndex } from '../../types' import { @@ -7,7 +9,6 @@ import { normalizeToInputChannel, } from '../../utils/peer-utils' import { assertTypeIs } from '../../utils/type-assertion' -import { tl } from '@mtcute/tl' import { ChatMember } from '../../types' /** diff --git a/packages/client/src/methods/chats/get-chat-members.ts b/packages/client/src/methods/chats/get-chat-members.ts index 253e809a..af9cfcf2 100644 --- a/packages/client/src/methods/chats/get-chat-members.ts +++ b/packages/client/src/methods/chats/get-chat-members.ts @@ -1,20 +1,21 @@ +import Long from 'long' +import { tl } from '@mtcute/tl' +import { assertNever } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { ChatMember, InputPeerLike, MtInvalidPeerTypeError, PeersIndex, } from '../../types' -import { TelegramClient } from '../../client' import { isInputPeerChannel, isInputPeerChat, normalizeToInputChannel, } from '../../utils/peer-utils' import { assertTypeIs } from '../../utils/type-assertion' -import { tl } from '@mtcute/tl' import { ArrayWithTotal } from '../../types' -import Long from 'long' -import { assertNever } from '@mtcute/core' /** * Get a chunk of members of some chat. diff --git a/packages/client/src/methods/chats/get-chat-preview.ts b/packages/client/src/methods/chats/get-chat-preview.ts index 0b0556a6..da75f183 100644 --- a/packages/client/src/methods/chats/get-chat-preview.ts +++ b/packages/client/src/methods/chats/get-chat-preview.ts @@ -1,5 +1,5 @@ -import { MtArgumentError, MtNotFoundError } from '../../types' import { TelegramClient } from '../../client' +import { MtArgumentError, MtNotFoundError } from '../../types' import { INVITE_LINK_REGEX } from '../../utils/peer-utils' import { ChatPreview } from '../../types' diff --git a/packages/client/src/methods/chats/get-chat.ts b/packages/client/src/methods/chats/get-chat.ts index 92b6fd0b..7fa6cbb3 100644 --- a/packages/client/src/methods/chats/get-chat.ts +++ b/packages/client/src/methods/chats/get-chat.ts @@ -1,3 +1,5 @@ +import { tl } from '@mtcute/tl' + import { Chat, InputPeerLike, MtArgumentError } from '../../types' import { TelegramClient } from '../../client' import { @@ -8,7 +10,6 @@ import { normalizeToInputChannel, normalizeToInputUser, } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' /** * Get basic information about a chat. diff --git a/packages/client/src/methods/chats/get-full-chat.ts b/packages/client/src/methods/chats/get-full-chat.ts index 514df4f8..7c0d20e5 100644 --- a/packages/client/src/methods/chats/get-full-chat.ts +++ b/packages/client/src/methods/chats/get-full-chat.ts @@ -1,5 +1,7 @@ -import { Chat, InputPeerLike, MtArgumentError } from '../../types' +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' +import { Chat, InputPeerLike, MtArgumentError } from '../../types' import { INVITE_LINK_REGEX, isInputPeerChannel, @@ -8,7 +10,6 @@ import { normalizeToInputChannel, normalizeToInputUser, } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' /** * Get full information about a chat. diff --git a/packages/client/src/methods/chats/get-nearby-chats.ts b/packages/client/src/methods/chats/get-nearby-chats.ts index f957e8b1..061ed586 100644 --- a/packages/client/src/methods/chats/get-nearby-chats.ts +++ b/packages/client/src/methods/chats/get-nearby-chats.ts @@ -1,8 +1,9 @@ +import { tl } from '@mtcute/tl' +import { getMarkedPeerId } from '@mtcute/core' + import { TelegramClient } from '../../client' import { Chat } from '../../types' import { assertTypeIs } from '../../utils/type-assertion' -import { getMarkedPeerId } from '@mtcute/core' -import { tl } from '@mtcute/tl' import { assertIsUpdatesGroup } from '../../utils/updates-utils' /** diff --git a/packages/client/src/methods/chats/kick-chat-member.ts b/packages/client/src/methods/chats/kick-chat-member.ts index 553f7c6a..6a61f2c9 100644 --- a/packages/client/src/methods/chats/kick-chat-member.ts +++ b/packages/client/src/methods/chats/kick-chat-member.ts @@ -1,7 +1,8 @@ +import { sleep } from '@mtcute/core' + import { TelegramClient } from '../../client' import { InputPeerLike } from '../../types' import { isInputPeerChannel } from '../../utils/peer-utils' -import { sleep } from '@mtcute/core' /** * Kick a user from a chat. diff --git a/packages/client/src/methods/chats/leave-chat.ts b/packages/client/src/methods/chats/leave-chat.ts index b36f6819..fbf746d0 100644 --- a/packages/client/src/methods/chats/leave-chat.ts +++ b/packages/client/src/methods/chats/leave-chat.ts @@ -1,5 +1,5 @@ -import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' import { TelegramClient } from '../../client' +import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' import { isInputPeerChannel, isInputPeerChat, diff --git a/packages/client/src/methods/chats/restrict-chat-member.ts b/packages/client/src/methods/chats/restrict-chat-member.ts index fe7f0a35..ca7d4fed 100644 --- a/packages/client/src/methods/chats/restrict-chat-member.ts +++ b/packages/client/src/methods/chats/restrict-chat-member.ts @@ -1,10 +1,11 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' import { isInputPeerChannel, normalizeToInputChannel, } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' import { normalizeDate } from '../../utils/misc-utils' /** diff --git a/packages/client/src/methods/chats/save-draft.ts b/packages/client/src/methods/chats/save-draft.ts index 5c253775..ad9658f8 100644 --- a/packages/client/src/methods/chats/save-draft.ts +++ b/packages/client/src/methods/chats/save-draft.ts @@ -1,6 +1,7 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike } from '../../types' -import { tl } from '@mtcute/tl' /** * Save or delete a draft message associated with some chat diff --git a/packages/client/src/methods/chats/set-chat-default-permissions.ts b/packages/client/src/methods/chats/set-chat-default-permissions.ts index f73880ff..db042876 100644 --- a/packages/client/src/methods/chats/set-chat-default-permissions.ts +++ b/packages/client/src/methods/chats/set-chat-default-permissions.ts @@ -1,6 +1,7 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { Chat, InputPeerLike } from '../../types' -import { tl } from '@mtcute/tl' import { assertIsUpdatesGroup } from '../../utils/updates-utils' /** diff --git a/packages/client/src/methods/chats/set-chat-photo.ts b/packages/client/src/methods/chats/set-chat-photo.ts index 9539cf42..fd364917 100644 --- a/packages/client/src/methods/chats/set-chat-photo.ts +++ b/packages/client/src/methods/chats/set-chat-photo.ts @@ -1,3 +1,6 @@ +import { tl } from '@mtcute/tl' +import { fileIdToInputPhoto, tdFileId } from '@mtcute/file-id' + import { TelegramClient } from '../../client' import { InputFileLike, @@ -11,8 +14,6 @@ import { isInputPeerChat, normalizeToInputChannel, } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' -import { fileIdToInputPhoto, tdFileId } from '@mtcute/file-id' /** * Set a new chat photo or video. @@ -46,7 +47,7 @@ export async function setChatPhoto( throw new MtArgumentError("Chat photo can't be external") if (typeof media === 'string' && media.match(/^file:/)) { const uploaded = await this.uploadFile({ - file: media.substr(5), + file: media.substring(5), }) inputFile = uploaded.inputFile } else { diff --git a/packages/client/src/methods/chats/unarchive-chats.ts b/packages/client/src/methods/chats/unarchive-chats.ts index 051bc07c..1afe9440 100644 --- a/packages/client/src/methods/chats/unarchive-chats.ts +++ b/packages/client/src/methods/chats/unarchive-chats.ts @@ -1,7 +1,8 @@ -import { TelegramClient } from '../../client' -import { MaybeArray } from '@mtcute/core' -import { InputPeerLike } from '../../types' import { tl } from '@mtcute/tl' +import { MaybeArray } from '@mtcute/core' + +import { TelegramClient } from '../../client' +import { InputPeerLike } from '../../types' /** * Unarchive one or more chats diff --git a/packages/client/src/methods/contacts/add-contact.ts b/packages/client/src/methods/contacts/add-contact.ts index ca6a343f..aea7bf38 100644 --- a/packages/client/src/methods/contacts/add-contact.ts +++ b/packages/client/src/methods/contacts/add-contact.ts @@ -1,9 +1,5 @@ import { TelegramClient } from '../../client' -import { - InputPeerLike, - MtInvalidPeerTypeError, - User, -} from '../../types' +import { InputPeerLike, MtInvalidPeerTypeError, User } from '../../types' import { normalizeToInputUser } from '../../utils/peer-utils' import { assertIsUpdatesGroup } from '../../utils/updates-utils' diff --git a/packages/client/src/methods/contacts/delete-contacts.ts b/packages/client/src/methods/contacts/delete-contacts.ts index c27718a2..9335e6f1 100644 --- a/packages/client/src/methods/contacts/delete-contacts.ts +++ b/packages/client/src/methods/contacts/delete-contacts.ts @@ -1,10 +1,7 @@ -import { TelegramClient } from '../../client' import { MaybeArray } from '@mtcute/core' -import { - InputPeerLike, - MtInvalidPeerTypeError, - User, -} from '../../types' + +import { TelegramClient } from '../../client' +import { InputPeerLike, MtInvalidPeerTypeError, User } from '../../types' import { normalizeToInputUser } from '../../utils/peer-utils' import { assertIsUpdatesGroup } from '../../utils/updates-utils' diff --git a/packages/client/src/methods/contacts/get-contacts.ts b/packages/client/src/methods/contacts/get-contacts.ts index 8263500b..6c536fcd 100644 --- a/packages/client/src/methods/contacts/get-contacts.ts +++ b/packages/client/src/methods/contacts/get-contacts.ts @@ -1,7 +1,8 @@ +import Long from 'long' + import { TelegramClient } from '../../client' import { User } from '../../types' import { assertTypeIs } from '../../utils/type-assertion' -import Long from 'long' /** * Get list of contacts from your Telegram contacts list. diff --git a/packages/client/src/methods/contacts/import-contacts.ts b/packages/client/src/methods/contacts/import-contacts.ts index a4d2c975..cb7499de 100644 --- a/packages/client/src/methods/contacts/import-contacts.ts +++ b/packages/client/src/methods/contacts/import-contacts.ts @@ -1,7 +1,8 @@ -import { TelegramClient } from '../../client' +import Long from 'long' import { tl } from '@mtcute/tl' import { PartialOnly } from '@mtcute/core' -import Long from 'long' + +import { TelegramClient } from '../../client' /** * Import contacts to your Telegram contacts list. diff --git a/packages/client/src/methods/dialogs/_init-conversation.ts b/packages/client/src/methods/dialogs/_init-conversation.ts index 81461a55..cd1f3c9f 100644 --- a/packages/client/src/methods/dialogs/_init-conversation.ts +++ b/packages/client/src/methods/dialogs/_init-conversation.ts @@ -1,6 +1,7 @@ +import { getMarkedPeerId } from '@mtcute/core' + import { TelegramClient } from '../../client' import { Conversation, Message } from '../../types' -import { getMarkedPeerId } from '@mtcute/core' // @extension interface ConversationsState { diff --git a/packages/client/src/methods/dialogs/create-folder.ts b/packages/client/src/methods/dialogs/create-folder.ts index f4eb8322..93c9c7a6 100644 --- a/packages/client/src/methods/dialogs/create-folder.ts +++ b/packages/client/src/methods/dialogs/create-folder.ts @@ -1,7 +1,8 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' import { PartialExcept } from '@mtcute/core' +import { TelegramClient } from '../../client' + /** * Create a folder from given parameters * diff --git a/packages/client/src/methods/dialogs/delete-folder.ts b/packages/client/src/methods/dialogs/delete-folder.ts index 5850e0ae..ec570971 100644 --- a/packages/client/src/methods/dialogs/delete-folder.ts +++ b/packages/client/src/methods/dialogs/delete-folder.ts @@ -1,6 +1,7 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' + /** * Delete a folder by its ID * diff --git a/packages/client/src/methods/dialogs/edit-folder.ts b/packages/client/src/methods/dialogs/edit-folder.ts index ee3363c7..f50e856d 100644 --- a/packages/client/src/methods/dialogs/edit-folder.ts +++ b/packages/client/src/methods/dialogs/edit-folder.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { MtArgumentError } from '../../types' /** @@ -24,7 +25,11 @@ export async function editFolder( } if (typeof folder === 'number' || typeof folder === 'string') { const old = await this.getFolders() - const found = old.find((it) => it._ === 'dialogFilter' && (it.id === folder || it.title === folder)) + const found = old.find( + (it) => + it._ === 'dialogFilter' && + (it.id === folder || it.title === folder) + ) if (!found) throw new MtArgumentError(`Could not find a folder ${folder}`) diff --git a/packages/client/src/methods/dialogs/find-folder.ts b/packages/client/src/methods/dialogs/find-folder.ts index 8cc29195..8e004511 100644 --- a/packages/client/src/methods/dialogs/find-folder.ts +++ b/packages/client/src/methods/dialogs/find-folder.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { MtArgumentError } from '../../types' /** @@ -26,13 +27,13 @@ export async function findFolder( const folders = await this.getFolders() return ( - folders.find((it) => { + (folders.find((it) => { if (it._ === 'dialogFilterDefault') return false if (params.id && it.id !== params.id) return false if (params.title && it.title !== params.title) return false if (params.emoji && it.emoticon !== params.emoji) return false return true - }) as tl.RawDialogFilter ?? null + }) as tl.RawDialogFilter) ?? null ) } diff --git a/packages/client/src/methods/dialogs/get-dialogs.ts b/packages/client/src/methods/dialogs/get-dialogs.ts index 0e1f19e7..36031ab3 100644 --- a/packages/client/src/methods/dialogs/get-dialogs.ts +++ b/packages/client/src/methods/dialogs/get-dialogs.ts @@ -1,11 +1,9 @@ -import { TelegramClient } from '../../client' -import { - Dialog, - MtArgumentError, -} from '../../types' -import { normalizeDate } from '../../utils/misc-utils' -import { tl } from '@mtcute/tl' import Long from 'long' +import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' +import { Dialog, MtArgumentError } from '../../types' +import { normalizeDate } from '../../utils/misc-utils' /** * Iterate over dialogs. @@ -127,16 +125,14 @@ export async function* getDialogs( ) { const folders = await this.getFolders() const found = folders.find((it) => { - if (it._ === 'dialogFilterDefault' ) { + if (it._ === 'dialogFilterDefault') { return params!.folder === 0 } return it.id === params!.folder || it.title === params!.folder }) if (!found) - throw new MtArgumentError( - `Could not find folder ${params.folder}` - ) + throw new MtArgumentError(`Could not find folder ${params.folder}`) filters = found as tl.RawDialogFilter } else { @@ -151,34 +147,42 @@ export async function* getDialogs( } } else { filters = { - _: 'dialogFilterDefault' + _: 'dialogFilterDefault', } } } - const fetchPinnedDialogsFromFolder = async (): Promise => { - if (!filters || filters._ === 'dialogFilterDefault' || !filters.pinnedPeers.length) return null - const res = await this.call({ - _: 'messages.getPeerDialogs', - peers: filters.pinnedPeers.map((peer) => ({ - _: 'inputDialogPeer', - peer, - })), - }) + const fetchPinnedDialogsFromFolder = + async (): Promise => { + if ( + !filters || + filters._ === 'dialogFilterDefault' || + !filters.pinnedPeers.length + ) + return null + const res = await this.call({ + _: 'messages.getPeerDialogs', + peers: filters.pinnedPeers.map((peer) => ({ + _: 'inputDialogPeer', + peer, + })), + }) - res.dialogs.forEach( - (dialog: tl.Mutable) => (dialog.pinned = true) - ) - - return res - } + res.dialogs.forEach( + (dialog: tl.Mutable) => (dialog.pinned = true) + ) + return res + } const pinned = params.pinned ?? 'include' let archived = params.archived ?? 'exclude' if (filters) { - archived = filters._ !== 'dialogFilterDefault' && filters.excludeArchived ? 'exclude' : 'keep' + archived = + filters._ !== 'dialogFilterDefault' && filters.excludeArchived + ? 'exclude' + : 'keep' } if (pinned === 'only') { @@ -203,7 +207,12 @@ export async function* getDialogs( let offsetDate = normalizeDate(params.offsetDate) ?? 0 let offsetPeer = params.offsetPeer ?? { _: 'inputPeerEmpty' } - if (filters && filters._ !== 'dialogFilterDefault' && filters.pinnedPeers.length && pinned === 'include') { + if ( + filters && + filters._ !== 'dialogFilterDefault' && + filters.pinnedPeers.length && + pinned === 'include' + ) { const res = await fetchPinnedDialogsFromFolder() if (res) { const dialogs = this._parseDialogs(res) diff --git a/packages/client/src/methods/dialogs/get-folders.ts b/packages/client/src/methods/dialogs/get-folders.ts index 9f21997e..7260bbea 100644 --- a/packages/client/src/methods/dialogs/get-folders.ts +++ b/packages/client/src/methods/dialogs/get-folders.ts @@ -1,6 +1,7 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' + /** * Get list of folders. * @internal diff --git a/packages/client/src/methods/dialogs/get-peer-dialogs.ts b/packages/client/src/methods/dialogs/get-peer-dialogs.ts index 1cdada45..6594cc81 100644 --- a/packages/client/src/methods/dialogs/get-peer-dialogs.ts +++ b/packages/client/src/methods/dialogs/get-peer-dialogs.ts @@ -1,10 +1,8 @@ -import { TelegramClient } from '../../client' -import { - Dialog, - InputPeerLike, -} from '../../types' import { MaybeArray } from '@mtcute/core' +import { TelegramClient } from '../../client' +import { Dialog, InputPeerLike } from '../../types' + /** * Get dialogs with certain peers. * diff --git a/packages/client/src/methods/dialogs/parse-dialogs.ts b/packages/client/src/methods/dialogs/parse-dialogs.ts index 8916a1c1..452f94c4 100644 --- a/packages/client/src/methods/dialogs/parse-dialogs.ts +++ b/packages/client/src/methods/dialogs/parse-dialogs.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' -import { Dialog, MtTypeAssertionError, PeersIndex } from '../../types' import { getMarkedPeerId } from '@mtcute/core' +import { TelegramClient } from '../../client' +import { Dialog, MtTypeAssertionError, PeersIndex } from '../../types' + /** @internal */ export function _parseDialogs( this: TelegramClient, diff --git a/packages/client/src/methods/dialogs/set-folders.ts b/packages/client/src/methods/dialogs/set-folders.ts index ddace5cb..9591dfee 100644 --- a/packages/client/src/methods/dialogs/set-folders.ts +++ b/packages/client/src/methods/dialogs/set-folders.ts @@ -1,5 +1,4 @@ import { TelegramClient } from '../../client' -import { tl } from '@mtcute/tl' /** * Reorder folders @@ -14,6 +13,6 @@ export async function setFoldersOrder( ): Promise { await this.call({ _: 'messages.updateDialogFiltersOrder', - order + order, }) } diff --git a/packages/client/src/methods/files/download-buffer.ts b/packages/client/src/methods/files/download-buffer.ts index b7d89133..ffa7290d 100644 --- a/packages/client/src/methods/files/download-buffer.ts +++ b/packages/client/src/methods/files/download-buffer.ts @@ -1,5 +1,5 @@ -import { FileDownloadParameters, FileLocation } from '../../types' import { TelegramClient } from '../../client' +import { FileDownloadParameters, FileLocation } from '../../types' /** * Download a file and return its contents as a Buffer. diff --git a/packages/client/src/methods/files/download-iterable.ts b/packages/client/src/methods/files/download-iterable.ts index 12cdd1bc..9c23b249 100644 --- a/packages/client/src/methods/files/download-iterable.ts +++ b/packages/client/src/methods/files/download-iterable.ts @@ -1,17 +1,18 @@ +import { tl } from '@mtcute/tl' +import { + fileIdToInputFileLocation, + fileIdToInputWebFileLocation, + parseFileId, +} from '@mtcute/file-id' + import { TelegramClient } from '../../client' import { determinePartSize } from '../../utils/file-utils' -import { tl } from '@mtcute/tl' import { MtArgumentError, MtUnsupportedError, FileDownloadParameters, FileLocation, } from '../../types' -import { - fileIdToInputFileLocation, - fileIdToInputWebFileLocation, - parseFileId, -} from '@mtcute/file-id' /** * Download a file and return it as an iterable, which yields file contents diff --git a/packages/client/src/methods/files/download-stream.ts b/packages/client/src/methods/files/download-stream.ts index 6a74ec88..4b82a008 100644 --- a/packages/client/src/methods/files/download-stream.ts +++ b/packages/client/src/methods/files/download-stream.ts @@ -1,4 +1,5 @@ import { Readable } from 'stream' + import { TelegramClient } from '../../client' import { FileLocation, FileDownloadParameters } from '../../types' import { bufferToStream } from '../../utils/stream-utils' diff --git a/packages/client/src/methods/files/normalize-file-to-document.ts b/packages/client/src/methods/files/normalize-file-to-document.ts index 44084941..df52e901 100644 --- a/packages/client/src/methods/files/normalize-file-to-document.ts +++ b/packages/client/src/methods/files/normalize-file-to-document.ts @@ -1,6 +1,7 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputFileLike } from '../../types' -import { tl } from '@mtcute/tl' import { assertTypeIs } from '../../utils/type-assertion' /** diff --git a/packages/client/src/methods/files/normalize-input-file.ts b/packages/client/src/methods/files/normalize-input-file.ts index 095257d9..6e77b8fa 100644 --- a/packages/client/src/methods/files/normalize-input-file.ts +++ b/packages/client/src/methods/files/normalize-input-file.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' -import { InputFileLike, isUploadedFile, MtArgumentError } from '../../types' import { tl } from '@mtcute/tl' import { tdFileId } from '@mtcute/file-id' +import { TelegramClient } from '../../client' +import { InputFileLike, isUploadedFile, MtArgumentError } from '../../types' + /** * Normalize a {@link InputFileLike} to `InputFile`, * uploading it if needed. @@ -26,7 +27,7 @@ export async function _normalizeInputFile( } else if (tdFileId.isFileIdLike(input)) { if (typeof input === 'string' && input.match(/^file:/)) { const uploaded = await this.uploadFile({ - file: input.substr(5), + file: input.substring(5), ...params, }) return uploaded.inputFile diff --git a/packages/client/src/methods/files/normalize-input-media.ts b/packages/client/src/methods/files/normalize-input-media.ts index 72c069df..2a8f4b9d 100644 --- a/packages/client/src/methods/files/normalize-input-media.ts +++ b/packages/client/src/methods/files/normalize-input-media.ts @@ -1,9 +1,4 @@ -import { TelegramClient } from '../../client' -import { - InputMediaLike, - isUploadedFile, - UploadFileLike, -} from '../../types' +import Long from 'long' import { tl } from '@mtcute/tl' import { fileIdToInputDocument, @@ -11,11 +6,13 @@ import { parseFileId, tdFileId, } from '@mtcute/file-id' + +import { TelegramClient } from '../../client' +import { InputMediaLike, isUploadedFile, UploadFileLike } from '../../types' import { extractFileName } from '../../utils/file-utils' import { assertTypeIs } from '../../utils/type-assertion' import { normalizeDate } from '../../utils/misc-utils' import { encodeWaveform } from '../../utils/voice-utils' -import Long from 'long' /** * Normalize an {@link InputMediaLike} to `InputMedia`, @@ -292,7 +289,7 @@ export async function _normalizeInputMedia( media.type === 'photo' ) } else if (typeof input === 'string' && input.match(/^file:/)) { - await upload(input.substr(5)) + await upload(input.substring(5)) } else { const parsed = typeof input === 'string' ? parseFileId(input) : input diff --git a/packages/client/src/methods/files/upload-file.ts b/packages/client/src/methods/files/upload-file.ts index 0f227e33..fdb99545 100644 --- a/packages/client/src/methods/files/upload-file.ts +++ b/packages/client/src/methods/files/upload-file.ts @@ -1,17 +1,18 @@ +import type { ReadStream } from 'fs' +import { Readable } from 'stream' +import { fromBuffer } from 'file-type' +import { tl } from '@mtcute/tl' +import { randomLong } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { bufferToStream, convertWebStreamToNodeReadable, readBytesFromStream, readStreamUntilEnd, } from '../../utils/stream-utils' -import type { ReadStream } from 'fs' -import { Readable } from 'stream' import { determinePartSize, isProbablyPlainText } from '../../utils/file-utils' -import { fromBuffer } from 'file-type' -import { tl } from '@mtcute/tl' import { MtArgumentError, UploadFileLike, UploadedFile } from '../../types' -import { TelegramClient } from '../../client' -import { randomLong } from '@mtcute/core' let fs: any = null let path: any = null @@ -20,7 +21,6 @@ try { path = require('path') } catch (e) {} - const OVERRIDE_MIME: Record = { // tg doesn't interpret `audio/opus` files as voice messages for some reason 'audio/opus': 'audio/ogg', @@ -135,7 +135,12 @@ export async function uploadFile( file = convertWebStreamToNodeReadable(file) } - if (typeof file === 'object' && 'headers' in file && 'body' in file && 'url' in file) { + if ( + typeof file === 'object' && + 'headers' in file && + 'body' in file && + 'url' in file + ) { // fetch() response const length = parseInt(file.headers.get('content-length') || '0') if (!isNaN(length) && length) fileSize = length @@ -187,9 +192,7 @@ export async function uploadFile( } if (!(file instanceof Readable)) - throw new MtArgumentError( - 'Could not convert input `file` to stream!' - ) + throw new MtArgumentError('Could not convert input `file` to stream!') const partSizeKb = params.partSize ?? determinePartSize(fileSize) if (partSizeKb > 512) diff --git a/packages/client/src/methods/files/upload-media.ts b/packages/client/src/methods/files/upload-media.ts index 3a689c50..5f37c812 100644 --- a/packages/client/src/methods/files/upload-media.ts +++ b/packages/client/src/methods/files/upload-media.ts @@ -1,15 +1,17 @@ +import { assertNever } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { InputMediaLike, InputPeerLike, MessageMedia, MtArgumentError, MtTypeAssertionError, - Photo, RawDocument, + Photo, + RawDocument, } from '../../types' -import { TelegramClient } from '../../client' import { assertTypeIs } from '../../utils/type-assertion' import { parseDocument } from '../../types/media/document-utils' -import { assertNever } from '@mtcute/core' /** * Upload a media to Telegram servers, without actually diff --git a/packages/client/src/methods/invite-links/create-invite-link.ts b/packages/client/src/methods/invite-links/create-invite-link.ts index 16db86ad..44d9d4ba 100644 --- a/packages/client/src/methods/invite-links/create-invite-link.ts +++ b/packages/client/src/methods/invite-links/create-invite-link.ts @@ -43,7 +43,7 @@ export async function createInviteLink( peer: await this.resolvePeer(chatId), expireDate: normalizeDate(params.expires), usageLimit: params.usageLimit, - requestNeeded: params.withApproval + requestNeeded: params.withApproval, }) return new ChatInviteLink(this, res) diff --git a/packages/client/src/methods/invite-links/edit-invite-link.ts b/packages/client/src/methods/invite-links/edit-invite-link.ts index fd7ae8c1..2aaa54e0 100644 --- a/packages/client/src/methods/invite-links/edit-invite-link.ts +++ b/packages/client/src/methods/invite-links/edit-invite-link.ts @@ -46,7 +46,7 @@ export async function editInviteLink( link, expireDate: normalizeDate(params.expires), usageLimit: params.usageLimit, - requestNeeded: params.withApproval + requestNeeded: params.withApproval, }) const peers = PeersIndex.from(res) diff --git a/packages/client/src/methods/invite-links/get-invite-link-members.ts b/packages/client/src/methods/invite-links/get-invite-link-members.ts index c86be23e..1c94eb29 100644 --- a/packages/client/src/methods/invite-links/get-invite-link-members.ts +++ b/packages/client/src/methods/invite-links/get-invite-link-members.ts @@ -1,6 +1,7 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { ChatInviteLink, InputPeerLike, PeersIndex, User } from '../../types' -import { tl } from '@mtcute/tl' /** * Iterate over users who have joined @@ -49,8 +50,8 @@ export async function* getInviteLinkMembers( for (;;) { // for some reason ts needs annotation, idk - const res: tl.RpcCallReturn['messages.getChatInviteImporters'] = await this.call( - { + const res: tl.RpcCallReturn['messages.getChatInviteImporters'] = + await this.call({ _: 'messages.getChatInviteImporters', limit: Math.min(100, limit - current), peer, @@ -59,8 +60,7 @@ export async function* getInviteLinkMembers( q: params.requestedSearch, offsetDate, offsetUser, - } - ) + }) if (!res.importers.length) break @@ -82,7 +82,7 @@ export async function* getInviteLinkMembers( date: new Date(it.date * 1000), isPendingRequest: it.requested!, bio: it.about, - approvedBy: it.approvedBy + approvedBy: it.approvedBy, } } diff --git a/packages/client/src/methods/invite-links/get-invite-links.ts b/packages/client/src/methods/invite-links/get-invite-links.ts index 215706ac..0c88a926 100644 --- a/packages/client/src/methods/invite-links/get-invite-links.ts +++ b/packages/client/src/methods/invite-links/get-invite-links.ts @@ -1,12 +1,14 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { ChatInviteLink, InputPeerLike, - MtInvalidPeerTypeError, MtTypeAssertionError, - PeersIndex -} from "../../types"; + MtInvalidPeerTypeError, + MtTypeAssertionError, + PeersIndex, +} from '../../types' import { normalizeToInputUser } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' /** * Get invite links created by some administrator in the chat. @@ -59,16 +61,15 @@ export async function* getInviteLinks( let offsetLink: string | undefined = undefined for (;;) { - const res: tl.RpcCallReturn['messages.getExportedChatInvites'] = await this.call( - { + const res: tl.RpcCallReturn['messages.getExportedChatInvites'] = + await this.call({ _: 'messages.getExportedChatInvites', peer, adminId: admin, limit: Math.min(chunkSize, total - current), offsetDate, offsetLink, - } - ) + }) if (!res.invites.length) break @@ -76,7 +77,11 @@ export async function* getInviteLinks( const last = res.invites[res.invites.length - 1] if (last._ === 'chatInvitePublicJoinRequests') { - throw new MtTypeAssertionError('getInviteLinks', 'chatInviteExported', last._) + throw new MtTypeAssertionError( + 'getInviteLinks', + 'chatInviteExported', + last._ + ) } offsetDate = last.date offsetLink = last.link diff --git a/packages/client/src/methods/invite-links/get-primary-invite-link.ts b/packages/client/src/methods/invite-links/get-primary-invite-link.ts index e5706c4e..e4cf1afa 100644 --- a/packages/client/src/methods/invite-links/get-primary-invite-link.ts +++ b/packages/client/src/methods/invite-links/get-primary-invite-link.ts @@ -2,7 +2,8 @@ import { TelegramClient } from '../../client' import { ChatInviteLink, InputPeerLike, - MtTypeAssertionError, PeersIndex, + MtTypeAssertionError, + PeersIndex, } from '../../types' /** diff --git a/packages/client/src/methods/messages/close-poll.ts b/packages/client/src/methods/messages/close-poll.ts index b9bb2643..9177bbb6 100644 --- a/packages/client/src/methods/messages/close-poll.ts +++ b/packages/client/src/methods/messages/close-poll.ts @@ -1,8 +1,14 @@ +import Long from 'long' + import { TelegramClient } from '../../client' -import { InputPeerLike, MtTypeAssertionError, PeersIndex, Poll } from '../../types' +import { + InputPeerLike, + MtTypeAssertionError, + PeersIndex, + Poll, +} from '../../types' import { assertTypeIs } from '../../utils/type-assertion' import { assertIsUpdatesGroup } from '../../utils/updates-utils' -import Long from 'long' /** * Close a poll sent by you. diff --git a/packages/client/src/methods/messages/delete-messages.ts b/packages/client/src/methods/messages/delete-messages.ts index d6e8c21d..5bc7e07b 100644 --- a/packages/client/src/methods/messages/delete-messages.ts +++ b/packages/client/src/methods/messages/delete-messages.ts @@ -1,6 +1,7 @@ +import { MaybeArray } from '@mtcute/core' + import { TelegramClient } from '../../client' import { InputPeerLike } from '../../types' -import { MaybeArray } from '@mtcute/core' import { isInputPeerChannel, normalizeToInputChannel, diff --git a/packages/client/src/methods/messages/delete-scheduled-messages.ts b/packages/client/src/methods/messages/delete-scheduled-messages.ts index 540760be..a88f2cd0 100644 --- a/packages/client/src/methods/messages/delete-scheduled-messages.ts +++ b/packages/client/src/methods/messages/delete-scheduled-messages.ts @@ -1,6 +1,7 @@ +import { MaybeArray } from '@mtcute/core' + import { TelegramClient } from '../../client' import { InputPeerLike } from '../../types' -import { MaybeArray } from '@mtcute/core' /** * Delete scheduled messages. @@ -12,7 +13,7 @@ import { MaybeArray } from '@mtcute/core' export async function deleteScheduledMessages( this: TelegramClient, chatId: InputPeerLike, - ids: MaybeArray, + ids: MaybeArray ): Promise { if (!Array.isArray(ids)) ids = [ids] @@ -21,7 +22,7 @@ export async function deleteScheduledMessages( const res = await this.call({ _: 'messages.deleteScheduledMessages', peer, - id: ids + id: ids, }) this._handleUpdate(res) diff --git a/packages/client/src/methods/messages/edit-inline-message.ts b/packages/client/src/methods/messages/edit-inline-message.ts index 03b70642..e6a20ca0 100644 --- a/packages/client/src/methods/messages/edit-inline-message.ts +++ b/packages/client/src/methods/messages/edit-inline-message.ts @@ -1,7 +1,13 @@ -import { TelegramClient } from '../../client' -import { BotKeyboard, FormattedString, InputMediaLike, ReplyMarkup } from '../../types' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' +import { + BotKeyboard, + FormattedString, + InputMediaLike, + ReplyMarkup, +} from '../../types' + /** * Edit sent inline message text, media and reply markup. * diff --git a/packages/client/src/methods/messages/edit-message.ts b/packages/client/src/methods/messages/edit-message.ts index d6c79ec4..7b19dc8f 100644 --- a/packages/client/src/methods/messages/edit-message.ts +++ b/packages/client/src/methods/messages/edit-message.ts @@ -1,12 +1,14 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { - BotKeyboard, FormattedString, + BotKeyboard, + FormattedString, InputMediaLike, InputPeerLike, Message, ReplyMarkup, } from '../../types' -import { tl } from '@mtcute/tl' /** * Edit message text, media, reply markup and schedule date. diff --git a/packages/client/src/methods/messages/find-in-update.ts b/packages/client/src/methods/messages/find-in-update.ts index 65b3b9d6..f93f4316 100644 --- a/packages/client/src/methods/messages/find-in-update.ts +++ b/packages/client/src/methods/messages/find-in-update.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { Message, MtTypeAssertionError, PeersIndex } from '../../types' import { assertIsUpdatesGroup } from '../../utils/updates-utils' diff --git a/packages/client/src/methods/messages/forward-messages.ts b/packages/client/src/methods/messages/forward-messages.ts index 4902a2fa..3fba4edc 100644 --- a/packages/client/src/methods/messages/forward-messages.ts +++ b/packages/client/src/methods/messages/forward-messages.ts @@ -1,3 +1,6 @@ +import { tl } from '@mtcute/tl' +import { MaybeArray, randomLong } from '@mtcute/core' + import { TelegramClient } from '../../client' import { FormattedString, @@ -7,8 +10,6 @@ import { MtArgumentError, PeersIndex, } from '../../types' -import { MaybeArray, randomLong } from '@mtcute/core' -import { tl } from '@mtcute/tl' import { normalizeDate } from '../../utils/misc-utils' import { assertIsUpdatesGroup } from '../../utils/updates-utils' @@ -317,7 +318,7 @@ export async function forwardMessages( schedule: params.schedule, clearDraft: params.clearDraft, forbidForwards: params.forbidForwards, - sendAs: params.sendAs + sendAs: params.sendAs, }) } else if (params.captionMedia) { captionMessage = await this.sendMedia(toPeer, params.captionMedia, { @@ -326,7 +327,7 @@ export async function forwardMessages( schedule: params.schedule, clearDraft: params.clearDraft, forbidForwards: params.forbidForwards, - sendAs: params.sendAs + sendAs: params.sendAs, }) } @@ -343,7 +344,9 @@ export async function forwardMessages( dropAuthor: params.noAuthor, dropMediaCaptions: params.noCaption, noforwards: params.forbidForwards, - sendAs: params.sendAs ? await this.resolvePeer(params.sendAs) : undefined + sendAs: params.sendAs + ? await this.resolvePeer(params.sendAs) + : undefined, }) assertIsUpdatesGroup('messages.forwardMessages', res) diff --git a/packages/client/src/methods/messages/get-history.ts b/packages/client/src/methods/messages/get-history.ts index e41c3027..ffacade7 100644 --- a/packages/client/src/methods/messages/get-history.ts +++ b/packages/client/src/methods/messages/get-history.ts @@ -1,8 +1,14 @@ -import { TelegramClient } from '../../client' -import { InputPeerLike, Message, MtTypeAssertionError, PeersIndex } from '../../types' -import { normalizeDate } from '../../utils/misc-utils' import Long from 'long' +import { TelegramClient } from '../../client' +import { + InputPeerLike, + Message, + MtTypeAssertionError, + PeersIndex, +} from '../../types' +import { normalizeDate } from '../../utils/misc-utils' + /** * Retrieve a chunk of the chat history. * diff --git a/packages/client/src/methods/messages/get-message-reactions.ts b/packages/client/src/methods/messages/get-message-reactions.ts index 9e357a11..ce441d1b 100644 --- a/packages/client/src/methods/messages/get-message-reactions.ts +++ b/packages/client/src/methods/messages/get-message-reactions.ts @@ -1,7 +1,8 @@ +import { getMarkedPeerId, MaybeArray } from '@mtcute/core' + import { TelegramClient } from '../../client' import { InputPeerLike, PeersIndex, MessageReactions } from '../../types' import { assertIsUpdatesGroup } from '../../utils/updates-utils' -import { getMarkedPeerId, MaybeArray } from '@mtcute/core' import { assertTypeIs } from '../../utils/type-assertion' /** diff --git a/packages/client/src/methods/messages/get-messages-unsafe.ts b/packages/client/src/methods/messages/get-messages-unsafe.ts index c53cdcf2..36961c26 100644 --- a/packages/client/src/methods/messages/get-messages-unsafe.ts +++ b/packages/client/src/methods/messages/get-messages-unsafe.ts @@ -1,6 +1,7 @@ -import { TelegramClient } from '../../client' -import { MaybeArray } from '@mtcute/core' import { tl } from '@mtcute/tl' +import { MaybeArray } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { Message, MtTypeAssertionError, PeersIndex } from '../../types' /** diff --git a/packages/client/src/methods/messages/get-messages.ts b/packages/client/src/methods/messages/get-messages.ts index 0d0a871c..603d3d7f 100644 --- a/packages/client/src/methods/messages/get-messages.ts +++ b/packages/client/src/methods/messages/get-messages.ts @@ -1,11 +1,17 @@ -import { TelegramClient } from '../../client' +import { tl } from '@mtcute/tl' import { MaybeArray } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { isInputPeerChannel, normalizeToInputChannel, } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' -import { Message, InputPeerLike, MtTypeAssertionError, PeersIndex } from '../../types' +import { + Message, + InputPeerLike, + MtTypeAssertionError, + PeersIndex, +} from '../../types' /** * Get a single message in chat by its ID @@ -93,18 +99,33 @@ export async function getMessages( // (channels have their own message numbering) switch (peer._) { case 'inputPeerSelf': - if (!(msg.peerId._ === 'peerUser' && msg.peerId.userId === this._userId)) + if ( + !( + msg.peerId._ === 'peerUser' && + msg.peerId.userId === this._userId + ) + ) return null - break; + break case 'inputPeerUser': case 'inputPeerUserFromMessage': - if (!(msg.peerId._ === 'peerUser' && msg.peerId.userId === peer.userId)) + if ( + !( + msg.peerId._ === 'peerUser' && + msg.peerId.userId === peer.userId + ) + ) return null - break; + break case 'inputPeerChat': - if (!(msg.peerId._ === 'peerChat' && msg.peerId.chatId === peer.chatId)) + if ( + !( + msg.peerId._ === 'peerChat' && + msg.peerId.chatId === peer.chatId + ) + ) return null - break; + break } } diff --git a/packages/client/src/methods/messages/get-reaction-users.ts b/packages/client/src/methods/messages/get-reaction-users.ts index c6a22270..aa69924a 100644 --- a/packages/client/src/methods/messages/get-reaction-users.ts +++ b/packages/client/src/methods/messages/get-reaction-users.ts @@ -1,11 +1,8 @@ -import { TelegramClient } from '../../client' -import { - InputPeerLike, - PeerReaction, - PeersIndex, -} from '../../types' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' +import { InputPeerLike, PeerReaction, PeersIndex } from '../../types' + /** * Get users who have reacted to the message. * diff --git a/packages/client/src/methods/messages/get-scheduled-messages.ts b/packages/client/src/methods/messages/get-scheduled-messages.ts index c34e4314..f317f893 100644 --- a/packages/client/src/methods/messages/get-scheduled-messages.ts +++ b/packages/client/src/methods/messages/get-scheduled-messages.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { MaybeArray } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { Message, InputPeerLike, diff --git a/packages/client/src/methods/messages/normalize-inline.ts b/packages/client/src/methods/messages/normalize-inline.ts index 2b73ab97..ef3e666e 100644 --- a/packages/client/src/methods/messages/normalize-inline.ts +++ b/packages/client/src/methods/messages/normalize-inline.ts @@ -1,6 +1,7 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' import { SessionConnection } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { parseInlineMessageId } from '../../utils/inline-utils' // @extension @@ -25,9 +26,8 @@ export async function _normalizeInline( let connection = this.primaryConnection if (id.dcId !== connection.params.dc.id) { if (!(id.dcId in this._connectionsForInline)) { - this._connectionsForInline[ - id.dcId - ] = await this.createAdditionalConnection(id.dcId) + this._connectionsForInline[id.dcId] = + await this.createAdditionalConnection(id.dcId) } connection = this._connectionsForInline[id.dcId] } diff --git a/packages/client/src/methods/messages/parse-entities.ts b/packages/client/src/methods/messages/parse-entities.ts index 5bfe4d14..6a189ad8 100644 --- a/packages/client/src/methods/messages/parse-entities.ts +++ b/packages/client/src/methods/messages/parse-entities.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { normalizeToInputUser } from '../../utils/peer-utils' import { FormattedString, MtClientError } from '../../types' @@ -32,7 +33,7 @@ export async function _parseEntities( throw new MtClientError(`Parse mode ${mode} is not registered.`) } - ;[text, entities] = await this._parseModes[mode].parse(text) + ;[text, entities] = this._parseModes[mode].parse(text) } // replace mentionName entities with input ones diff --git a/packages/client/src/methods/messages/read-reactions.ts b/packages/client/src/methods/messages/read-reactions.ts index 6546c290..c39ae39d 100644 --- a/packages/client/src/methods/messages/read-reactions.ts +++ b/packages/client/src/methods/messages/read-reactions.ts @@ -10,11 +10,11 @@ import { createDummyUpdate } from '../../utils/updates-utils' */ export async function readReactions( this: TelegramClient, - chatId: InputPeerLike, + chatId: InputPeerLike ): Promise { const res = await this.call({ _: 'messages.readReactions', - peer: await this.resolvePeer(chatId) + peer: await this.resolvePeer(chatId), }) this._handleUpdate(createDummyUpdate(res.pts, res.ptsCount)) } diff --git a/packages/client/src/methods/messages/search-global.ts b/packages/client/src/methods/messages/search-global.ts index 96fc9e08..dd61eb64 100644 --- a/packages/client/src/methods/messages/search-global.ts +++ b/packages/client/src/methods/messages/search-global.ts @@ -1,6 +1,7 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { Message, MtTypeAssertionError, PeersIndex } from '../../types' -import { tl } from '@mtcute/tl' import { SearchFilters } from '../../types' /** @@ -85,7 +86,8 @@ export async function* searchGlobal( if (!msgs.length) break const last = msgs[msgs.length - 1] - offsetRate = (res as tl.messages.RawMessagesSlice).nextRate ?? last.raw.date + offsetRate = + (res as tl.messages.RawMessagesSlice).nextRate ?? last.raw.date offsetPeer = last.chat.inputPeer offsetId = last.id diff --git a/packages/client/src/methods/messages/search-messages.ts b/packages/client/src/methods/messages/search-messages.ts index ea05a1b2..bfc6f384 100644 --- a/packages/client/src/methods/messages/search-messages.ts +++ b/packages/client/src/methods/messages/search-messages.ts @@ -1,8 +1,14 @@ -import { TelegramClient } from '../../client' -import { InputPeerLike, Message, MtTypeAssertionError, PeersIndex } from '../../types' -import { tl } from '@mtcute/tl' -import { SearchFilters } from '../../types' import Long from 'long' +import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' +import { + InputPeerLike, + Message, + MtTypeAssertionError, + PeersIndex, +} from '../../types' +import { SearchFilters } from '../../types' /** * Search for messages inside a specific chat diff --git a/packages/client/src/methods/messages/send-copy.ts b/packages/client/src/methods/messages/send-copy.ts index 5ea47dd4..e93d78c8 100644 --- a/packages/client/src/methods/messages/send-copy.ts +++ b/packages/client/src/methods/messages/send-copy.ts @@ -1,7 +1,13 @@ -import { TelegramClient } from '../../client' -import { InputPeerLike, Message, FormattedString, ReplyMarkup } from '../../types' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' +import { + InputPeerLike, + Message, + FormattedString, + ReplyMarkup, +} from '../../types' + /** * Copy a message (i.e. send the same message, * but do not forward it). diff --git a/packages/client/src/methods/messages/send-media-group.ts b/packages/client/src/methods/messages/send-media-group.ts index 34b11a7d..beb2397c 100644 --- a/packages/client/src/methods/messages/send-media-group.ts +++ b/packages/client/src/methods/messages/send-media-group.ts @@ -1,18 +1,18 @@ +import { tl } from '@mtcute/tl' +import { randomLong } from '@mtcute/core' + import { TelegramClient } from '../../client' import { - BotKeyboard, InputFileLike, + BotKeyboard, InputMediaLike, InputPeerLike, - Message, MtArgumentError, PeersIndex, + Message, + MtArgumentError, + PeersIndex, ReplyMarkup, } from '../../types' -import { - normalizeDate, - normalizeMessageId, -} from '../../utils/misc-utils' -import { tl } from '@mtcute/tl' +import { normalizeDate, normalizeMessageId } from '../../utils/misc-utils' import { assertIsUpdatesGroup } from '../../utils/updates-utils' -import { randomLong } from '@mtcute/core' /** * Send a group of media. @@ -141,8 +141,7 @@ export async function sendMediaGroup( const msg = await this.getMessages(peer, replyTo) - if (!msg) - throw new tl.errors.MessageNotFoundError() + if (!msg) throw new tl.errors.MessageNotFoundError() } const multiMedia: tl.RawInputSingleMedia[] = [] @@ -157,13 +156,17 @@ export async function sendMediaGroup( } } - const inputMedia = await this._normalizeInputMedia(media, { - progressCallback: params.progressCallback?.bind(null, i), - // i have no fucking clue why we should upload it manually, - // but otherwise Telegram throws MEDIA_INVALID - // fuck my life - uploadPeer: peer - }, true) + const inputMedia = await this._normalizeInputMedia( + media, + { + progressCallback: params.progressCallback?.bind(null, i), + // i have no fucking clue why we should upload it manually, + // but otherwise Telegram throws MEDIA_INVALID + // fuck my life + uploadPeer: peer, + }, + true + ) const [message, entities] = await this._parseEntities( // some types dont have `caption` field, and ts warns us, @@ -194,7 +197,9 @@ export async function sendMediaGroup( replyMarkup, clearDraft: params.clearDraft, noforwards: params.forbidForwards, - sendAs: params.sendAs ? await this.resolvePeer(params.sendAs) : undefined + sendAs: params.sendAs + ? await this.resolvePeer(params.sendAs) + : undefined, }) assertIsUpdatesGroup('_findMessageInUpdate', res) diff --git a/packages/client/src/methods/messages/send-media.ts b/packages/client/src/methods/messages/send-media.ts index e3bbb6f5..a500ecc3 100644 --- a/packages/client/src/methods/messages/send-media.ts +++ b/packages/client/src/methods/messages/send-media.ts @@ -1,3 +1,6 @@ +import { tl } from '@mtcute/tl' +import { randomLong } from '@mtcute/core' + import { TelegramClient } from '../../client' import { BotKeyboard, @@ -9,8 +12,6 @@ import { ReplyMarkup, } from '../../types' import { normalizeDate, normalizeMessageId } from '../../utils/misc-utils' -import { tl } from '@mtcute/tl' -import { randomLong } from '@mtcute/core' /** * Send a single media (a photo or a document-based media) @@ -184,7 +185,9 @@ export async function sendMedia( entities, clearDraft: params.clearDraft, noforwards: params.forbidForwards, - sendAs: params.sendAs ? await this.resolvePeer(params.sendAs) : undefined + sendAs: params.sendAs + ? await this.resolvePeer(params.sendAs) + : undefined, }) const msg = this._findMessageInUpdate(res) diff --git a/packages/client/src/methods/messages/send-reaction.ts b/packages/client/src/methods/messages/send-reaction.ts index 6191a50f..26900fa1 100644 --- a/packages/client/src/methods/messages/send-reaction.ts +++ b/packages/client/src/methods/messages/send-reaction.ts @@ -1,3 +1,5 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike, @@ -6,7 +8,6 @@ import { PeersIndex, } from '../../types' import { assertIsUpdatesGroup } from '../../utils/updates-utils' -import { tl } from '@mtcute/tl' /** * Send or remove a reaction. diff --git a/packages/client/src/methods/messages/send-scheduled.ts b/packages/client/src/methods/messages/send-scheduled.ts index 274b4463..fa3fdce5 100644 --- a/packages/client/src/methods/messages/send-scheduled.ts +++ b/packages/client/src/methods/messages/send-scheduled.ts @@ -1,5 +1,6 @@ -import { InputPeerLike, Message, PeersIndex } from '../../types' import { MaybeArray } from '@mtcute/core' + +import { InputPeerLike, Message, PeersIndex } from '../../types' import { TelegramClient } from '../../client' import { assertIsUpdatesGroup } from '../../utils/updates-utils' @@ -49,7 +50,7 @@ export async function sendScheduled( const res = await this.call({ _: 'messages.sendScheduledMessages', peer: await this.resolvePeer(peer), - id: (ids as number[]) + id: ids as number[], }) assertIsUpdatesGroup('sendScheduled', res) @@ -60,17 +61,9 @@ export async function sendScheduled( const msgs = res.updates .filter( (u) => - u._ === 'updateNewMessage' || - u._ === 'updateNewChannelMessage' - ) - .map( - (u) => - new Message( - this, - (u as any).message, - peers - ) + u._ === 'updateNewMessage' || u._ === 'updateNewChannelMessage' ) + .map((u) => new Message(this, (u as any).message, peers)) this._pushConversationMessage(msgs[msgs.length - 1]) diff --git a/packages/client/src/methods/messages/send-text.ts b/packages/client/src/methods/messages/send-text.ts index d242f8b4..3e9dee19 100644 --- a/packages/client/src/methods/messages/send-text.ts +++ b/packages/client/src/methods/messages/send-text.ts @@ -1,19 +1,19 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' +import { getMarkedPeerId, randomLong } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { inputPeerToPeer } from '../../utils/peer-utils' -import { - normalizeDate, - normalizeMessageId, -} from '../../utils/misc-utils' +import { normalizeDate, normalizeMessageId } from '../../utils/misc-utils' import { InputPeerLike, Message, BotKeyboard, ReplyMarkup, MtTypeAssertionError, - MtArgumentError, FormattedString, PeersIndex, + MtArgumentError, + FormattedString, + PeersIndex, } from '../../types' -import { getMarkedPeerId, randomLong } from '@mtcute/core' import { createDummyUpdate } from '../../utils/updates-utils' /** @@ -143,8 +143,7 @@ export async function sendText( const msg = await this.getMessages(peer, replyTo) - if (!msg) - throw new tl.errors.MessageNotFoundError() + if (!msg) throw new tl.errors.MessageNotFoundError() } const res = await this.call({ @@ -160,7 +159,9 @@ export async function sendText( entities, clearDraft: params.clearDraft, noforwards: params.forbidForwards, - sendAs: params.sendAs ? await this.resolvePeer(params.sendAs) : undefined + sendAs: params.sendAs + ? await this.resolvePeer(params.sendAs) + : undefined, }) if (res._ === 'updateShortSentMessage') { diff --git a/packages/client/src/methods/messages/send-typing.ts b/packages/client/src/methods/messages/send-typing.ts index dc971471..f84d57de 100644 --- a/packages/client/src/methods/messages/send-typing.ts +++ b/packages/client/src/methods/messages/send-typing.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' -import { InputPeerLike, TypingStatus } from '../../types' import { assertNever } from '@mtcute/core' +import { TelegramClient } from '../../client' +import { InputPeerLike, TypingStatus } from '../../types' + /** * Sends a current user/bot typing event * to a conversation partner or group. diff --git a/packages/client/src/methods/messages/send-vote.ts b/packages/client/src/methods/messages/send-vote.ts index 05039f7c..1f9fc750 100644 --- a/packages/client/src/methods/messages/send-vote.ts +++ b/packages/client/src/methods/messages/send-vote.ts @@ -1,3 +1,6 @@ +import { tl } from '@mtcute/tl' +import { MaybeArray } from '@mtcute/core' + import { TelegramClient } from '../../client' import { InputPeerLike, @@ -6,10 +9,8 @@ import { PeersIndex, Poll, } from '../../types' -import { MaybeArray } from '@mtcute/core' import { assertTypeIs } from '../../utils/type-assertion' import { assertIsUpdatesGroup } from '../../utils/updates-utils' -import { tl } from '@mtcute/tl' /** * Send or retract a vote in a poll. @@ -41,9 +42,7 @@ export async function sendVote( if (!msg) throw new tl.errors.MessageNotFoundError() if (!(msg.media instanceof Poll)) - throw new MtArgumentError( - 'This message does not contain a poll' - ) + throw new MtArgumentError('This message does not contain a poll') poll = msg.media options = options.map((opt) => { diff --git a/packages/client/src/methods/messages/translate-text.ts b/packages/client/src/methods/messages/translate-text.ts index 267dbde7..42f8e7e1 100644 --- a/packages/client/src/methods/messages/translate-text.ts +++ b/packages/client/src/methods/messages/translate-text.ts @@ -1,5 +1,4 @@ import { TelegramClient } from '../../client' -import { InputPeerLike } from '../../types' /** * Translate text to a given language. diff --git a/packages/client/src/methods/misc/init-takeout-session.ts b/packages/client/src/methods/misc/init-takeout-session.ts index 2ac926ab..bc9ece5f 100644 --- a/packages/client/src/methods/misc/init-takeout-session.ts +++ b/packages/client/src/methods/misc/init-takeout-session.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { TakeoutSession } from '../../types' /** diff --git a/packages/client/src/methods/pasword/change-cloud-password.ts b/packages/client/src/methods/pasword/change-cloud-password.ts index 399c5be6..46d76a3c 100644 --- a/packages/client/src/methods/pasword/change-cloud-password.ts +++ b/packages/client/src/methods/pasword/change-cloud-password.ts @@ -1,7 +1,8 @@ +import { computeSrpParams, computeNewPasswordHash } from '@mtcute/core' + import { TelegramClient } from '../../client' import { MtArgumentError } from '../../types' import { assertTypeIs } from '../../utils/type-assertion' -import { computeSrpParams, computeNewPasswordHash } from '@mtcute/core' /** * Change your 2FA password diff --git a/packages/client/src/methods/pasword/enable-cloud-password.ts b/packages/client/src/methods/pasword/enable-cloud-password.ts index ece987db..4ee94096 100644 --- a/packages/client/src/methods/pasword/enable-cloud-password.ts +++ b/packages/client/src/methods/pasword/enable-cloud-password.ts @@ -1,7 +1,8 @@ +import { computeNewPasswordHash } from '@mtcute/core' + import { TelegramClient } from '../../client' import { MtArgumentError } from '../../types' import { assertTypeIs } from '../../utils/type-assertion' -import { computeNewPasswordHash } from '@mtcute/core' /** * Enable 2FA password on your account diff --git a/packages/client/src/methods/pasword/remove-cloud-password.ts b/packages/client/src/methods/pasword/remove-cloud-password.ts index dac7c04f..088046cf 100644 --- a/packages/client/src/methods/pasword/remove-cloud-password.ts +++ b/packages/client/src/methods/pasword/remove-cloud-password.ts @@ -1,6 +1,7 @@ +import { computeSrpParams } from '@mtcute/core' + import { TelegramClient } from '../../client' import { MtArgumentError } from '../../types' -import { computeSrpParams } from '@mtcute/core' /** * Remove 2FA password from your account diff --git a/packages/client/src/methods/stickers/add-sticker-to-set.ts b/packages/client/src/methods/stickers/add-sticker-to-set.ts index 48de5de4..fed0ea97 100644 --- a/packages/client/src/methods/stickers/add-sticker-to-set.ts +++ b/packages/client/src/methods/stickers/add-sticker-to-set.ts @@ -1,7 +1,8 @@ -import { TelegramClient } from '../../client' -import { InputStickerSetItem, MtTypeAssertionError, StickerSet } from '../../types' import { tl } from '@mtcute/tl' +import { TelegramClient } from '../../client' +import { InputStickerSetItem, StickerSet } from '../../types' + const MASK_POS = { forehead: 0, eyes: 1, diff --git a/packages/client/src/methods/stickers/create-sticker-set.ts b/packages/client/src/methods/stickers/create-sticker-set.ts index 328aa29e..22c861d4 100644 --- a/packages/client/src/methods/stickers/create-sticker-set.ts +++ b/packages/client/src/methods/stickers/create-sticker-set.ts @@ -1,3 +1,5 @@ +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputFileLike, @@ -6,7 +8,6 @@ import { MtInvalidPeerTypeError, StickerSet, } from '../../types' -import { tl } from '@mtcute/tl' import { normalizeToInputUser } from '../../utils/peer-utils' const MASK_POS = { diff --git a/packages/client/src/methods/stickers/delete-sticker-from-set.ts b/packages/client/src/methods/stickers/delete-sticker-from-set.ts index 06d973ac..fc704f06 100644 --- a/packages/client/src/methods/stickers/delete-sticker-from-set.ts +++ b/packages/client/src/methods/stickers/delete-sticker-from-set.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' -import { StickerSet } from '../../types' import { fileIdToInputDocument, tdFileId } from '@mtcute/file-id' +import { TelegramClient } from '../../client' +import { StickerSet } from '../../types' + /** * Delete a sticker from a sticker set * diff --git a/packages/client/src/methods/stickers/get-installed-stickers.ts b/packages/client/src/methods/stickers/get-installed-stickers.ts index c643a59b..eaf3f109 100644 --- a/packages/client/src/methods/stickers/get-installed-stickers.ts +++ b/packages/client/src/methods/stickers/get-installed-stickers.ts @@ -1,7 +1,8 @@ +import Long from 'long' + import { TelegramClient } from '../../client' import { StickerSet } from '../../types' import { assertTypeIs } from '../../utils/type-assertion' -import Long from 'long' /** * Get a list of all installed sticker packs diff --git a/packages/client/src/methods/stickers/get-sticker-set.ts b/packages/client/src/methods/stickers/get-sticker-set.ts index 87080e5d..58dafb49 100644 --- a/packages/client/src/methods/stickers/get-sticker-set.ts +++ b/packages/client/src/methods/stickers/get-sticker-set.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { StickerSet } from '../../types' /** @@ -35,7 +36,7 @@ export async function getStickerSet( const res = await this.call({ _: 'messages.getStickerSet', stickerset: input, - hash: 0 + hash: 0, }) return new StickerSet(this, res) diff --git a/packages/client/src/methods/stickers/move-sticker-in-set.ts b/packages/client/src/methods/stickers/move-sticker-in-set.ts index a89b8fb4..2f37be39 100644 --- a/packages/client/src/methods/stickers/move-sticker-in-set.ts +++ b/packages/client/src/methods/stickers/move-sticker-in-set.ts @@ -1,6 +1,7 @@ -import { TelegramClient } from '../../client' -import { fileIdToInputDocument, tdFileId } from '@mtcute/file-id' import { tl } from '@mtcute/tl' +import { fileIdToInputDocument, tdFileId } from '@mtcute/file-id' + +import { TelegramClient } from '../../client' import { StickerSet } from '../../types' /** diff --git a/packages/client/src/methods/stickers/set-sticker-set-thumb.ts b/packages/client/src/methods/stickers/set-sticker-set-thumb.ts index 1dc8cd6b..f119f51a 100644 --- a/packages/client/src/methods/stickers/set-sticker-set-thumb.ts +++ b/packages/client/src/methods/stickers/set-sticker-set-thumb.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { InputFileLike, StickerSet } from '../../types' /** diff --git a/packages/client/src/methods/updates.ts b/packages/client/src/methods/updates.ts index 1f03aecc..5db04384 100644 --- a/packages/client/src/methods/updates.ts +++ b/packages/client/src/methods/updates.ts @@ -1,7 +1,4 @@ import { tl } from '@mtcute/tl' -import { TelegramClient } from '../client' -import { normalizeToInputChannel } from '../utils/peer-utils' -import { extractChannelIdFromUpdate } from '../utils/misc-utils' import { assertNever, AsyncLock, @@ -9,10 +6,15 @@ import { getMarkedPeerId, markedPeerIdToBare, toggleChannelIdMark, + Logger, } from '@mtcute/core' + +import { TelegramClient } from '../client' +import { normalizeToInputChannel } from '../utils/peer-utils' +import { extractChannelIdFromUpdate } from '../utils/misc-utils' import { MtArgumentError, PeersIndex } from '../types' import { _parseUpdate } from '../utils/parse-update' -import { Logger } from '@mtcute/core/src/utils/logger' + // @copy import { ConditionVariable } from '@mtcute/core/src/utils/condition-variable' // @copy diff --git a/packages/client/src/methods/users/delete-profile-photos.ts b/packages/client/src/methods/users/delete-profile-photos.ts index 50407c02..387159f3 100644 --- a/packages/client/src/methods/users/delete-profile-photos.ts +++ b/packages/client/src/methods/users/delete-profile-photos.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' -import { MaybeArray } from '@mtcute/core' import { tl } from '@mtcute/tl' +import { MaybeArray } from '@mtcute/core' import { fileIdToInputPhoto } from '@mtcute/file-id' +import { TelegramClient } from '../../client' + /** * Delete your own profile photos * diff --git a/packages/client/src/methods/users/get-common-chats.ts b/packages/client/src/methods/users/get-common-chats.ts index 5746722e..74953972 100644 --- a/packages/client/src/methods/users/get-common-chats.ts +++ b/packages/client/src/methods/users/get-common-chats.ts @@ -1,8 +1,7 @@ -import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' import { TelegramClient } from '../../client' +import { InputPeerLike, MtInvalidPeerTypeError } from '../../types' import { Chat } from '../../types' import { normalizeToInputUser } from '../../utils/peer-utils' -import Long from 'long' /** * Get a list of common chats you have with a given user diff --git a/packages/client/src/methods/users/get-profile-photos.ts b/packages/client/src/methods/users/get-profile-photos.ts index c29c58fa..56950944 100644 --- a/packages/client/src/methods/users/get-profile-photos.ts +++ b/packages/client/src/methods/users/get-profile-photos.ts @@ -1,8 +1,9 @@ +import Long from 'long' +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike, MtInvalidPeerTypeError, Photo } from '../../types' import { normalizeToInputUser } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' -import Long from 'long' /** * Get a list of profile pictures of a user diff --git a/packages/client/src/methods/users/get-users.ts b/packages/client/src/methods/users/get-users.ts index 9a98b35c..fc5dc0bd 100644 --- a/packages/client/src/methods/users/get-users.ts +++ b/packages/client/src/methods/users/get-users.ts @@ -1,6 +1,7 @@ -import { InputPeerLike, User } from '../../types' -import { TelegramClient } from '../../client' import { MaybeArray } from '@mtcute/core' + +import { TelegramClient } from '../../client' +import { InputPeerLike, User } from '../../types' import { normalizeToInputUser } from '../../utils/peer-utils' /** diff --git a/packages/client/src/methods/users/iter-profile-photos.ts b/packages/client/src/methods/users/iter-profile-photos.ts index b2babf34..cca034a8 100644 --- a/packages/client/src/methods/users/iter-profile-photos.ts +++ b/packages/client/src/methods/users/iter-profile-photos.ts @@ -1,8 +1,9 @@ +import Long from 'long' +import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike, MtInvalidPeerTypeError, Photo } from '../../types' import { normalizeToInputUser } from '../../utils/peer-utils' -import { tl } from '@mtcute/tl' -import Long from 'long' /** * Iterate over profile photos diff --git a/packages/client/src/methods/users/resolve-peer-many.ts b/packages/client/src/methods/users/resolve-peer-many.ts index aa484ad9..645af8af 100644 --- a/packages/client/src/methods/users/resolve-peer-many.ts +++ b/packages/client/src/methods/users/resolve-peer-many.ts @@ -1,7 +1,8 @@ +import { asyncPool } from 'eager-async-pool' import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { InputPeerLike } from '../../types' -import { asyncPool } from 'eager-async-pool' /** * Get multiple `InputPeer`s at once, @@ -45,11 +46,8 @@ export async function resolvePeerMany( obj: tl.TypeInputPeer ) => tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null ): Promise<(tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel)[]> { - const ret: ( - | tl.TypeInputPeer - | tl.TypeInputUser - | tl.TypeInputChannel - )[] = [] + const ret: (tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel)[] = + [] if (peerIds.length < 10) { // no point in using async pool for <10 peers diff --git a/packages/client/src/methods/users/resolve-peer.ts b/packages/client/src/methods/users/resolve-peer.ts index 89158d3b..4eea9c8a 100644 --- a/packages/client/src/methods/users/resolve-peer.ts +++ b/packages/client/src/methods/users/resolve-peer.ts @@ -1,9 +1,14 @@ +import Long from 'long' import { tl } from '@mtcute/tl' +import { + getBasicPeerType, + getMarkedPeerId, + toggleChannelIdMark, +} from '@mtcute/core' + import { TelegramClient } from '../../client' import { InputPeerLike, MtNotFoundError } from '../../types' -import { getBasicPeerType, getMarkedPeerId, toggleChannelIdMark } from '@mtcute/core' import { normalizeToInputPeer } from '../../utils/peer-utils' -import Long from 'long' import { assertTypeIs } from '../../utils/type-assertion' /** diff --git a/packages/client/src/methods/users/set-profile-photo.ts b/packages/client/src/methods/users/set-profile-photo.ts index a5dc3a96..9fc72f25 100644 --- a/packages/client/src/methods/users/set-profile-photo.ts +++ b/packages/client/src/methods/users/set-profile-photo.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' -import { InputFileLike, MtArgumentError, Photo } from '../../types' import { tl } from '@mtcute/tl' import { fileIdToInputPhoto, tdFileId } from '@mtcute/file-id' +import { TelegramClient } from '../../client' +import { InputFileLike, MtArgumentError, Photo } from '../../types' + /** * Set a new profile photo or video. * diff --git a/packages/client/src/types/auth/sent-code.ts b/packages/client/src/types/auth/sent-code.ts index b762305b..6c1ef10f 100644 --- a/packages/client/src/types/auth/sent-code.ts +++ b/packages/client/src/types/auth/sent-code.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { makeInspectable } from '../utils' const sentCodeMap: Record< @@ -30,7 +31,12 @@ export namespace SentCode { * - `call`: Code is sent via voice call * - `flash_call`: Code is the last 5 digits of the caller's phone number */ - export type DeliveryType = 'app' | 'sms' | 'call' | 'flash_call' | 'missed_call' + export type DeliveryType = + | 'app' + | 'sms' + | 'call' + | 'flash_call' + | 'missed_call' /** * Type describing next code delivery type. diff --git a/packages/client/src/types/auth/terms-of-service.ts b/packages/client/src/types/auth/terms-of-service.ts index ba01e78c..dcc1e1e7 100644 --- a/packages/client/src/types/auth/terms-of-service.ts +++ b/packages/client/src/types/auth/terms-of-service.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { MessageEntity } from '../messages' import { makeInspectable } from '../utils' diff --git a/packages/client/src/types/bots/callback-query.ts b/packages/client/src/types/bots/callback-query.ts index 5a0768e2..5b3e1396 100644 --- a/packages/client/src/types/bots/callback-query.ts +++ b/packages/client/src/types/bots/callback-query.ts @@ -1,9 +1,10 @@ +import { tl } from '@mtcute/tl' +import { BasicPeerType, getBasicPeerType, getMarkedPeerId } from '@mtcute/core' + import { makeInspectable } from '../utils' import { TelegramClient } from '../../client' -import { tl } from '@mtcute/tl' import { Message } from '../messages' import { MtArgumentError } from '../errors' -import { BasicPeerType, getBasicPeerType, getMarkedPeerId } from '@mtcute/core' import { encodeInlineMessageId } from '../../utils/inline-utils' import { User, PeersIndex } from '../peers' diff --git a/packages/client/src/types/bots/command-scope.ts b/packages/client/src/types/bots/command-scope.ts index 61f5a945..793255cb 100644 --- a/packages/client/src/types/bots/command-scope.ts +++ b/packages/client/src/types/bots/command-scope.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { InputPeerLike } from '../peers' /** @@ -15,14 +16,16 @@ export namespace BotCommands { * * Used to avoid manually resolving peers. */ - export type IntermediateScope = { - type: 'peer' | 'peer_admins' - peer: InputPeerLike - } | { - type: 'member' - chat: InputPeerLike - user: InputPeerLike - } + export type IntermediateScope = + | { + type: 'peer' | 'peer_admins' + peer: InputPeerLike + } + | { + type: 'member' + chat: InputPeerLike + user: InputPeerLike + } /** * Default commands scope. @@ -30,28 +33,28 @@ export namespace BotCommands { * Used if no commands with a narrower scope are available. */ export const default_: tl.RawBotCommandScopeDefault = { - _: 'botCommandScopeDefault' + _: 'botCommandScopeDefault', } as const /** * Scope that covers all private chats */ export const allPrivate: tl.RawBotCommandScopeUsers = { - _: 'botCommandScopeUsers' + _: 'botCommandScopeUsers', } as const /** * Scope that covers all group chats (both legacy and supergroups) */ export const allGroups: tl.RawBotCommandScopeChats = { - _: 'botCommandScopeChats' + _: 'botCommandScopeChats', } as const /** * Scope that covers all group chat administrators (both legacy and supergroups) */ export const allGroupAdmins: tl.RawBotCommandScopeChatAdmins = { - _: 'botCommandScopeChatAdmins' + _: 'botCommandScopeChatAdmins', } as const /** @@ -61,7 +64,7 @@ export namespace BotCommands { export function peer(peer: InputPeerLike): IntermediateScope { return { type: 'peer', - peer + peer, } } @@ -71,18 +74,21 @@ export namespace BotCommands { export function groupAdmins(peer: InputPeerLike): IntermediateScope { return { type: 'peer_admins', - peer + peer, } } /** * Scope that covers a specific user in a specific group */ - export function groupMember(chat: InputPeerLike, user: InputPeerLike): IntermediateScope { + export function groupMember( + chat: InputPeerLike, + user: InputPeerLike + ): IntermediateScope { return { type: 'member', chat, - user + user, } } @@ -92,11 +98,14 @@ export namespace BotCommands { * @param command Bot command (without slash) * @param description Command description */ - export function cmd(command: string, description: string): tl.RawBotCommand { + export function cmd( + command: string, + description: string + ): tl.RawBotCommand { return { _: 'botCommand', command, - description + description, } } } diff --git a/packages/client/src/types/bots/game-high-score.ts b/packages/client/src/types/bots/game-high-score.ts index e5081123..8550bd4c 100644 --- a/packages/client/src/types/bots/game-high-score.ts +++ b/packages/client/src/types/bots/game-high-score.ts @@ -1,6 +1,7 @@ +import { tl } from '@mtcute/tl' + import { makeInspectable } from '../utils' import { TelegramClient } from '../../client' -import { tl } from '@mtcute/tl' import { PeersIndex, User } from '../peers' /** diff --git a/packages/client/src/types/bots/inline-query.ts b/packages/client/src/types/bots/inline-query.ts index 4dc96f59..87f65dab 100644 --- a/packages/client/src/types/bots/inline-query.ts +++ b/packages/client/src/types/bots/inline-query.ts @@ -1,7 +1,8 @@ -import { makeInspectable } from '../utils' import { tl } from '@mtcute/tl' -import { PeersIndex, PeerType, User } from '../peers' + import { TelegramClient } from '../../client' +import { makeInspectable } from '../utils' +import { PeersIndex, PeerType, User } from '../peers' import { Location } from '../media' import { InputInlineResult } from './input' @@ -18,8 +19,7 @@ export class InlineQuery { readonly client: TelegramClient, readonly raw: tl.RawUpdateBotInlineQuery, readonly _peers: PeersIndex - ) { - } + ) {} /** * Unique query ID @@ -34,7 +34,10 @@ export class InlineQuery { */ get user(): User { if (!this._user) { - this._user = new User(this.client, this._peers.user(this.raw.userId)) + this._user = new User( + this.client, + this._peers.user(this.raw.userId) + ) } return this._user diff --git a/packages/client/src/types/bots/input/input-inline-message.ts b/packages/client/src/types/bots/input/input-inline-message.ts index c9efc490..191fc62c 100644 --- a/packages/client/src/types/bots/input/input-inline-message.ts +++ b/packages/client/src/types/bots/input/input-inline-message.ts @@ -1,6 +1,8 @@ import { tl } from '@mtcute/tl' -import { BotKeyboard, ReplyMarkup } from '../keyboards' +import { assertNever } from '@mtcute/core' + import { TelegramClient } from '../../../client' +import { BotKeyboard, ReplyMarkup } from '../keyboards' import { InputMediaContact, InputMediaGeo, @@ -8,7 +10,6 @@ import { InputMediaVenue, } from '../../media' import { FormattedString } from '../../parser' -import { assertNever } from '@mtcute/core' /** * Inline message containing only text diff --git a/packages/client/src/types/bots/input/input-inline-result.ts b/packages/client/src/types/bots/input/input-inline-result.ts index c5ab7da6..a67b1ebd 100644 --- a/packages/client/src/types/bots/input/input-inline-result.ts +++ b/packages/client/src/types/bots/input/input-inline-result.ts @@ -1,6 +1,7 @@ import { tl } from '@mtcute/tl' -import { BotInlineMessage, InputInlineMessage } from './input-inline-message' + import { TelegramClient } from '../../../client' +import { BotInlineMessage, InputInlineMessage } from './input-inline-message' import { fileIdToInputDocument, fileIdToInputPhoto } from '@mtcute/file-id' import { extractFileName } from '../../../utils/file-utils' import { MtArgumentError } from '../../errors' @@ -858,7 +859,7 @@ export namespace BotInline { }, provider: '', venueId: '', - venueType: '' + venueType: '', } } else { throw new MtArgumentError( diff --git a/packages/client/src/types/bots/keyboard-builder.ts b/packages/client/src/types/bots/keyboard-builder.ts index d624852f..cd397693 100644 --- a/packages/client/src/types/bots/keyboard-builder.ts +++ b/packages/client/src/types/bots/keyboard-builder.ts @@ -1,6 +1,7 @@ -import type { InlineKeyboardMarkup, ReplyKeyboardMarkup } from './keyboards' import { tl } from '@mtcute/tl' +import type { InlineKeyboardMarkup, ReplyKeyboardMarkup } from './keyboards' + type ButtonLike = tl.TypeKeyboardButton | false | null | undefined | void /** diff --git a/packages/client/src/types/bots/keyboards.ts b/packages/client/src/types/bots/keyboards.ts index c22e09ea..26bc69df 100644 --- a/packages/client/src/types/bots/keyboards.ts +++ b/packages/client/src/types/bots/keyboards.ts @@ -1,5 +1,6 @@ -import { assertNever } from '@mtcute/core' import { tl } from '@mtcute/tl' +import { assertNever } from '@mtcute/core' + import { BotKeyboardBuilder } from './keyboard-builder' import { normalizeToInputUser } from '../../utils/peer-utils' import { MtInvalidPeerTypeError } from '../errors' diff --git a/packages/client/src/types/conversation.ts b/packages/client/src/types/conversation.ts index c05dc452..d1ebf8a0 100644 --- a/packages/client/src/types/conversation.ts +++ b/packages/client/src/types/conversation.ts @@ -1,8 +1,10 @@ +import { tl } from '@mtcute/tl' import { AsyncLock, Deque, getMarkedPeerId, MaybeAsync } from '@mtcute/core' import { ControllablePromise, createControllablePromise, } from '@mtcute/core/src/utils/controllable-promise' + import { TelegramClient } from '../client' import { InputMediaLike } from './media' import { MtArgumentError } from './errors' @@ -10,7 +12,6 @@ import { InputPeerLike } from './peers' import { HistoryReadUpdate } from './updates' import { FormattedString } from './parser' import { Message } from './messages' -import { tl } from '@mtcute/tl' interface QueuedHandler { promise: ControllablePromise @@ -46,10 +47,7 @@ export class Conversation { private _pendingRead: Record> = {} - constructor( - readonly client: TelegramClient, - readonly chat: InputPeerLike - ) { + constructor(readonly client: TelegramClient, readonly chat: InputPeerLike) { this._onNewMessage = this._onNewMessage.bind(this) this._onEditMessage = this._onEditMessage.bind(this) this._onHistoryRead = this._onHistoryRead.bind(this) @@ -103,7 +101,8 @@ export class Conversation { const dialog = await this.client.getPeerDialogs(this._inputPeer) try { - this._lastMessage = this._lastReceivedMessage = dialog.lastMessage.id + this._lastMessage = this._lastReceivedMessage = + dialog.lastMessage.id } catch (e) { if (e instanceof tl.errors.MessageNotFoundError) { this._lastMessage = this._lastReceivedMessage = 0 @@ -130,14 +129,17 @@ export class Conversation { this.client.off('edit_message', this._onEditMessage) this.client.off('history_read', this._onHistoryRead) - const idx = this.client['_pendingConversations'][this._chatId].indexOf(this) - if (idx > -1) { // just in case + const idx = + this.client['_pendingConversations'][this._chatId].indexOf(this) + if (idx > -1) { + // just in case this.client['_pendingConversations'][this._chatId].splice(idx, 1) } if (!this.client['_pendingConversations'][this._chatId].length) { delete this.client['_pendingConversations'][this._chatId] } - this.client['_hasConversations'] = Object.keys(this.client['_pendingConversations']).length > 0 + this.client['_hasConversations'] = + Object.keys(this.client['_pendingConversations']).length > 0 // reset pending status this._queuedNewMessage.clear() @@ -197,11 +199,7 @@ export class Conversation { throw new MtArgumentError("Conversation hasn't started yet") } - return this.client.sendMediaGroup( - this._inputPeer, - medias, - params - ) + return this.client.sendMediaGroup(this._inputPeer, medias, params) } /** @@ -442,7 +440,10 @@ export class Conversation { * @param timeout Timeout for the handler in ms, def. 15 sec. Pass `null` to disable. * When the timeout is reached, `TimeoutError` is thrown. */ - async waitForRead(message?: number, timeout: number | null = 15000): Promise { + async waitForRead( + message?: number, + timeout: number | null = 15000 + ): Promise { if (!this._started) { throw new MtArgumentError("Conversation hasn't started yet") } @@ -475,7 +476,6 @@ export class Conversation { return promise } - private _onNewMessage(msg: Message) { if (msg.chat.id !== this._chatId) return @@ -514,7 +514,7 @@ export class Conversation { return } - (async () => { + ;(async () => { if (!it.check || (await it.check(msg))) { if (it.timeout) clearTimeout(it.timeout) it.promise.resolve(msg) diff --git a/packages/client/src/types/files/file-location.ts b/packages/client/src/types/files/file-location.ts index 679a7e2e..6c389513 100644 --- a/packages/client/src/types/files/file-location.ts +++ b/packages/client/src/types/files/file-location.ts @@ -1,6 +1,7 @@ -import { tl } from '@mtcute/tl' -import { TelegramClient } from '../../client' import { Readable } from 'stream' +import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' /** @@ -41,8 +42,7 @@ export class FileLocation { * DC ID of the file, when available */ readonly dcId?: number - ) { - } + ) {} /** * Download a file and return it as an iterable, which yields file contents diff --git a/packages/client/src/types/files/utils.ts b/packages/client/src/types/files/utils.ts index 163f599f..8805e256 100644 --- a/packages/client/src/types/files/utils.ts +++ b/packages/client/src/types/files/utils.ts @@ -1,9 +1,10 @@ -import { tl } from '@mtcute/tl' import type { Readable } from 'stream' import type { ReadStream } from 'fs' +import { tl } from '@mtcute/tl' +import { tdFileId } from '@mtcute/file-id' + import { UploadedFile } from './uploaded-file' import { FileLocation } from './file-location' -import { tdFileId } from '@mtcute/file-id' /** * Describes types that can be used in {@link TelegramClient.uploadFile} diff --git a/packages/client/src/types/files/web-document.ts b/packages/client/src/types/files/web-document.ts index f88bb155..ef27bf66 100644 --- a/packages/client/src/types/files/web-document.ts +++ b/packages/client/src/types/files/web-document.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { FileLocation } from './file-location' import { MtArgumentError } from '../errors' import { makeInspectable } from '../utils' diff --git a/packages/client/src/types/media/audio.ts b/packages/client/src/types/media/audio.ts index 48221b94..5d875549 100644 --- a/packages/client/src/types/media/audio.ts +++ b/packages/client/src/types/media/audio.ts @@ -1,8 +1,9 @@ import { tl } from '@mtcute/tl' +import { tdFileId } from '@mtcute/file-id' + import { TelegramClient } from '../../client' import { RawDocument } from './document' import { makeInspectable } from '../utils' -import { tdFileId } from '@mtcute/file-id' /** * An audio file diff --git a/packages/client/src/types/media/contact.ts b/packages/client/src/types/media/contact.ts index cea2e4fa..98377c53 100644 --- a/packages/client/src/types/media/contact.ts +++ b/packages/client/src/types/media/contact.ts @@ -1,9 +1,10 @@ +import { tl } from '@mtcute/tl' + +import { makeInspectable } from '../utils' + /** * A phone contact */ -import { tl } from '@mtcute/tl' -import { makeInspectable } from '../utils' - export class Contact { readonly type = 'contact' as const diff --git a/packages/client/src/types/media/dice.ts b/packages/client/src/types/media/dice.ts index d8c63466..f9c8c146 100644 --- a/packages/client/src/types/media/dice.ts +++ b/packages/client/src/types/media/dice.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { makeInspectable } from '../utils' /** diff --git a/packages/client/src/types/media/document-utils.ts b/packages/client/src/types/media/document-utils.ts index 6c7eb791..6239e732 100644 --- a/packages/client/src/types/media/document-utils.ts +++ b/packages/client/src/types/media/document-utils.ts @@ -1,7 +1,8 @@ import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { Document, RawDocument } from './document' import { Audio } from './audio' -import { TelegramClient } from '../../client' import { Video } from './video' import { Voice } from './voice' import { Sticker } from './sticker' diff --git a/packages/client/src/types/media/document.ts b/packages/client/src/types/media/document.ts index 4315e583..bab7dcaa 100644 --- a/packages/client/src/types/media/document.ts +++ b/packages/client/src/types/media/document.ts @@ -1,9 +1,10 @@ -import { FileLocation } from '../files' import { tl } from '@mtcute/tl' +import { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id' + +import { FileLocation } from '../files' import { Thumbnail } from './thumbnail' import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' -import { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id' /** * A file that is represented as a document in MTProto. diff --git a/packages/client/src/types/media/game.ts b/packages/client/src/types/media/game.ts index 43363a53..73cf58b4 100644 --- a/packages/client/src/types/media/game.ts +++ b/packages/client/src/types/media/game.ts @@ -1,7 +1,8 @@ import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { Photo } from './photo' import { Video } from './video' -import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' export class Game { diff --git a/packages/client/src/types/media/input-media.ts b/packages/client/src/types/media/input-media.ts index 4e707ca5..1ea9abdd 100644 --- a/packages/client/src/types/media/input-media.ts +++ b/packages/client/src/types/media/input-media.ts @@ -1,7 +1,8 @@ -import { InputFileLike } from '../files' import { tl } from '@mtcute/tl' -import { Venue } from './venue' import { MaybeArray } from '@mtcute/core' + +import { InputFileLike } from '../files' +import { Venue } from './venue' import { FormattedString } from '../parser' interface BaseInputMedia { diff --git a/packages/client/src/types/media/invoice.ts b/packages/client/src/types/media/invoice.ts index 581a66b5..3e933cda 100644 --- a/packages/client/src/types/media/invoice.ts +++ b/packages/client/src/types/media/invoice.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' import { WebDocument } from '../files/web-document' diff --git a/packages/client/src/types/media/location.ts b/packages/client/src/types/media/location.ts index 0f9a909d..86ed8662 100644 --- a/packages/client/src/types/media/location.ts +++ b/packages/client/src/types/media/location.ts @@ -1,7 +1,8 @@ -import { makeInspectable } from '../utils' import { tl } from '@mtcute/tl' -import { FileLocation } from '../files' + import { TelegramClient } from '../../client' +import { makeInspectable } from '../utils' +import { FileLocation } from '../files' /** * A point on the map @@ -109,7 +110,10 @@ export class Location extends RawLocation { export class LiveLocation extends RawLocation { readonly type = 'live_location' as const - constructor(client: TelegramClient, readonly live: tl.RawMessageMediaGeoLive) { + constructor( + client: TelegramClient, + readonly live: tl.RawMessageMediaGeoLive + ) { super(client, live.geo as tl.RawGeoPoint) } diff --git a/packages/client/src/types/media/photo.ts b/packages/client/src/types/media/photo.ts index 89cb8a2d..6663faa9 100644 --- a/packages/client/src/types/media/photo.ts +++ b/packages/client/src/types/media/photo.ts @@ -1,6 +1,7 @@ import { tl } from '@mtcute/tl' -import { FileLocation } from '../files' + import { TelegramClient } from '../../client' +import { FileLocation } from '../files' import { MtArgumentError } from '../errors' import { Thumbnail } from './thumbnail' import { makeInspectable } from '../utils' @@ -82,7 +83,7 @@ export class Photo extends FileLocation { * Whether this photo is an animated profile picture */ get isAnimated(): boolean { - return !!this.raw.videoSizes?.some(s => s.type === 'u') + return !!this.raw.videoSizes?.some((s) => s.type === 'u') } private _thumbnails?: Thumbnail[] diff --git a/packages/client/src/types/media/poll.ts b/packages/client/src/types/media/poll.ts index 775fd57c..2b4ecc91 100644 --- a/packages/client/src/types/media/poll.ts +++ b/packages/client/src/types/media/poll.ts @@ -1,9 +1,10 @@ -import { makeInspectable } from '../utils' +import Long from 'long' import { tl } from '@mtcute/tl' + +import { makeInspectable } from '../utils' import { TelegramClient } from '../../client' import { MessageEntity } from '../messages' import { PeersIndex } from '../peers' -import Long from 'long' export namespace Poll { export interface PollAnswer { diff --git a/packages/client/src/types/media/sticker.ts b/packages/client/src/types/media/sticker.ts index 015fa412..39298850 100644 --- a/packages/client/src/types/media/sticker.ts +++ b/packages/client/src/types/media/sticker.ts @@ -1,9 +1,10 @@ -import { RawDocument } from './document' -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' +import { tdFileId } from '@mtcute/file-id' + +import { TelegramClient } from '../../client' +import { RawDocument } from './document' import { makeInspectable } from '../utils' import { StickerSet } from '../misc' -import { tdFileId } from '@mtcute/file-id' export namespace Sticker { export interface MaskPosition { @@ -50,7 +51,9 @@ export class Sticker extends RawDocument { client: TelegramClient, doc: tl.RawDocument, readonly attr: tl.RawDocumentAttributeSticker, - readonly attr2?: tl.RawDocumentAttributeImageSize | tl.RawDocumentAttributeVideo + readonly attr2?: + | tl.RawDocumentAttributeImageSize + | tl.RawDocumentAttributeVideo ) { super(client, doc) } @@ -80,7 +83,7 @@ export class Sticker extends RawDocument { * Whether this sticker is a video (WEBM) sticker */ get isPremiumSticker(): boolean { - return !!this.raw.videoThumbs?.some(s => s.type === 'f') + return !!this.raw.videoThumbs?.some((s) => s.type === 'f') } /** diff --git a/packages/client/src/types/media/thumbnail.ts b/packages/client/src/types/media/thumbnail.ts index a82853ef..62a7a405 100644 --- a/packages/client/src/types/media/thumbnail.ts +++ b/packages/client/src/types/media/thumbnail.ts @@ -1,6 +1,9 @@ +import Long from 'long' +import { tl } from '@mtcute/tl' +import { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id' + import { TelegramClient } from '../../client' import { FileLocation } from '../files' -import { tl } from '@mtcute/tl' import { inflateSvgPath, strippedPhotoToJpg, @@ -9,8 +12,6 @@ import { import { MtArgumentError, MtTypeAssertionError } from '../errors' import { assertTypeIs } from '../../utils/type-assertion' import { makeInspectable } from '../utils' -import { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id' -import Long from 'long' /** * One size of some thumbnail @@ -269,7 +270,8 @@ export class Thumbnail extends FileLocation { this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail, - thumbnailType: this.raw.type === 'u' ? '\x00' : this.raw.type, + thumbnailType: + this.raw.type === 'u' ? '\x00' : this.raw.type, }, } ) diff --git a/packages/client/src/types/media/venue.ts b/packages/client/src/types/media/venue.ts index d61854f6..d680277c 100644 --- a/packages/client/src/types/media/venue.ts +++ b/packages/client/src/types/media/venue.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { Location } from './location' import { assertTypeIs } from '../../utils/type-assertion' import { makeInspectable } from '../utils' diff --git a/packages/client/src/types/media/video.ts b/packages/client/src/types/media/video.ts index edafe311..a5d858cb 100644 --- a/packages/client/src/types/media/video.ts +++ b/packages/client/src/types/media/video.ts @@ -1,8 +1,9 @@ -import { RawDocument } from './document' import { tl } from '@mtcute/tl' +import { tdFileId } from '@mtcute/file-id' + +import { RawDocument } from './document' import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' -import { tdFileId } from '@mtcute/file-id' /** * A video, round video message or GIF animation. diff --git a/packages/client/src/types/media/voice.ts b/packages/client/src/types/media/voice.ts index 62bddf24..61c87777 100644 --- a/packages/client/src/types/media/voice.ts +++ b/packages/client/src/types/media/voice.ts @@ -1,8 +1,9 @@ -import { RawDocument } from './document' import { tl } from '@mtcute/tl' +import { tdFileId } from '@mtcute/file-id' + +import { RawDocument } from './document' import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' -import { tdFileId } from '@mtcute/file-id' import { decodeWaveform } from '../../utils/voice-utils' /** @@ -41,4 +42,8 @@ export class Voice extends RawDocument { } } -makeInspectable(Voice, ['fileSize', 'dcId'], ['inputMedia', 'inputDocument', 'waveform']) +makeInspectable( + Voice, + ['fileSize', 'dcId'], + ['inputMedia', 'inputDocument', 'waveform'] +) diff --git a/packages/client/src/types/media/web-page.ts b/packages/client/src/types/media/web-page.ts index 5b089581..c3c02137 100644 --- a/packages/client/src/types/media/web-page.ts +++ b/packages/client/src/types/media/web-page.ts @@ -1,6 +1,7 @@ import { tl } from '@mtcute/tl' -import { Photo } from './photo' + import { TelegramClient } from '../../client' +import { Photo } from './photo' import { RawDocument } from './document' import { parseDocument } from './document-utils' import { makeInspectable } from '../utils' diff --git a/packages/client/src/types/messages/dialog.ts b/packages/client/src/types/messages/dialog.ts index c998baff..d8289117 100644 --- a/packages/client/src/types/messages/dialog.ts +++ b/packages/client/src/types/messages/dialog.ts @@ -1,10 +1,11 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' +import { getMarkedPeerId } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { Chat, PeersIndex } from '../peers' import { Message } from './message' import { DraftMessage } from './draft-message' import { makeInspectable } from '../utils' -import { getMarkedPeerId } from '@mtcute/core' /** * A dialog. diff --git a/packages/client/src/types/messages/draft-message.ts b/packages/client/src/types/messages/draft-message.ts index 99b363ed..e08dfd1a 100644 --- a/packages/client/src/types/messages/draft-message.ts +++ b/packages/client/src/types/messages/draft-message.ts @@ -1,7 +1,5 @@ -/** - * A draft message - */ import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { MessageEntity } from './message-entity' import { Message } from './message' @@ -9,13 +7,16 @@ import { InputPeerLike } from '../peers' import { makeInspectable } from '../utils' import { InputMediaWithCaption } from '../media' + +/** + * A draft message + */ export class DraftMessage { constructor( readonly client: TelegramClient, readonly raw: tl.RawDraftMessage, readonly _chatId: InputPeerLike - ) { - } + ) {} /** * Text of the draft message diff --git a/packages/client/src/types/messages/message-action.ts b/packages/client/src/types/messages/message-action.ts index a5374c51..9a5b982e 100644 --- a/packages/client/src/types/messages/message-action.ts +++ b/packages/client/src/types/messages/message-action.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { Photo } from '../media' import { _callDiscardReasonFromTl, diff --git a/packages/client/src/types/messages/message-entity.ts b/packages/client/src/types/messages/message-entity.ts index 1556eecb..b345da90 100644 --- a/packages/client/src/types/messages/message-entity.ts +++ b/packages/client/src/types/messages/message-entity.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { makeInspectable } from '../utils' const entityToType: Partial< diff --git a/packages/client/src/types/messages/message-media.ts b/packages/client/src/types/messages/message-media.ts index b321bae2..0a1e06b2 100644 --- a/packages/client/src/types/messages/message-media.ts +++ b/packages/client/src/types/messages/message-media.ts @@ -1,3 +1,5 @@ +import { tl } from '@mtcute/tl' + import { Audio, Contact, @@ -15,7 +17,6 @@ import { Voice, WebPage, } from '../media' -import { tl } from '@mtcute/tl' import { parseDocument } from '../media/document-utils' import { Message } from './message' diff --git a/packages/client/src/types/messages/message.ts b/packages/client/src/types/messages/message.ts index 089567f7..57ad61a3 100644 --- a/packages/client/src/types/messages/message.ts +++ b/packages/client/src/types/messages/message.ts @@ -1,7 +1,8 @@ -import { User, Chat, InputPeerLike, PeersIndex } from '../peers' import { tl } from '@mtcute/tl' -import { BotKeyboard, ReplyMarkup } from '../bots' import { assertNever, getMarkedPeerId, toggleChannelIdMark } from '@mtcute/core' + +import { User, Chat, InputPeerLike, PeersIndex } from '../peers' +import { BotKeyboard, ReplyMarkup } from '../bots' import { MtArgumentError, MtTypeAssertionError } from '../errors' import { TelegramClient } from '../../client' import { MessageEntity } from './message-entity' diff --git a/packages/client/src/types/messages/reactions.ts b/packages/client/src/types/messages/reactions.ts index 2656e08a..6163de27 100644 --- a/packages/client/src/types/messages/reactions.ts +++ b/packages/client/src/types/messages/reactions.ts @@ -1,7 +1,8 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' -import { makeInspectable } from '../utils' import { getMarkedPeerId } from '@mtcute/core' + +import { TelegramClient } from '../../client' +import { makeInspectable } from '../utils' import { PeersIndex, User } from '../peers' import { assertTypeIs } from '../../utils/type-assertion' @@ -110,7 +111,9 @@ export class MessageReactions { /** * Get the users who reacted to this message */ - getUsers(params?: Parameters[2]): AsyncIterableIterator { + getUsers( + params?: Parameters[2] + ): AsyncIterableIterator { return this.client.getReactionUsers(this.messageId, this.chatId, params) } } diff --git a/packages/client/src/types/misc/sticker-set.ts b/packages/client/src/types/misc/sticker-set.ts index 71466a12..2512773e 100644 --- a/packages/client/src/types/misc/sticker-set.ts +++ b/packages/client/src/types/misc/sticker-set.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' import { Sticker, Thumbnail } from '../media' import { MtEmptyError, MtTypeAssertionError } from '../errors' @@ -195,9 +196,10 @@ export class StickerSet { */ get thumbnails(): ReadonlyArray { if (!this._thumbnails) { - this._thumbnails = this.brief.thumbs?.map( - (sz) => new Thumbnail(this.client, this.brief, sz) - ) ?? [] + this._thumbnails = + this.brief.thumbs?.map( + (sz) => new Thumbnail(this.client, this.brief, sz) + ) ?? [] } return this._thumbnails diff --git a/packages/client/src/types/misc/takeout-session.ts b/packages/client/src/types/misc/takeout-session.ts index 67b30bf1..3df957bb 100644 --- a/packages/client/src/types/misc/takeout-session.ts +++ b/packages/client/src/types/misc/takeout-session.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' diff --git a/packages/client/src/types/parser.ts b/packages/client/src/types/parser.ts index 9cd301d0..2c72e544 100644 --- a/packages/client/src/types/parser.ts +++ b/packages/client/src/types/parser.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { MessageEntity } from '../types' /** @@ -46,7 +47,7 @@ export class FormattedString { * @param value Value that the string holds * @param mode Name of the parse mode used */ - constructor (readonly value: string, readonly mode?: T) {} + constructor(readonly value: string, readonly mode?: T) {} toString(): string { return this.value diff --git a/packages/client/src/types/peers/chat-event.ts b/packages/client/src/types/peers/chat-event.ts index 57d0922a..230f6297 100644 --- a/packages/client/src/types/peers/chat-event.ts +++ b/packages/client/src/types/peers/chat-event.ts @@ -1,6 +1,8 @@ +import { tl } from '@mtcute/tl' +import { toggleChannelIdMark } from '@mtcute/core' + import { makeInspectable } from '../utils' import { TelegramClient } from '../../client' -import { tl } from '@mtcute/tl' import { User } from './user' import { ChatMember } from './chat-member' import { Photo } from '../media' @@ -9,8 +11,6 @@ import { ChatPermissions } from './chat-permissions' import { ChatLocation } from './chat-location' import { ChatInviteLink } from './chat-invite-link' import { PeersIndex } from './index' -import { toggleChannelIdMark } from "@mtcute/core" - export namespace ChatEvent { /** A user has joined the group (in the case of big groups, info of the user that has joined isn't shown) */ @@ -370,34 +370,18 @@ function _actionFromTl( case 'channelAdminLogEventActionUpdatePinned': return { type: 'msg_pinned', - message: new Message( - this.client, - e.message, - this._peers - ), + message: new Message(this.client, e.message, this._peers), } case 'channelAdminLogEventActionEditMessage': return { type: 'msg_edited', - old: new Message( - this.client, - e.prevMessage, - this._peers - ), - new: new Message( - this.client, - e.newMessage, - this._peers - ), + old: new Message(this.client, e.prevMessage, this._peers), + new: new Message(this.client, e.newMessage, this._peers), } case 'channelAdminLogEventActionDeleteMessage': return { type: 'msg_deleted', - message: new Message( - this.client, - e.message, - this._peers - ), + message: new Message(this.client, e.message, this._peers), } case 'channelAdminLogEventActionParticipantLeave': return { type: 'user_left' } @@ -447,11 +431,7 @@ function _actionFromTl( case 'channelAdminLogEventActionStopPoll': return { type: 'poll_stopped', - message: new Message( - this.client, - e.message, - this._peers - ), + message: new Message(this.client, e.message, this._peers), } case 'channelAdminLogEventActionChangeLinkedChat': return { @@ -533,9 +513,8 @@ export class ChatEvent { constructor( readonly client: TelegramClient, readonly raw: tl.TypeChannelAdminLogEvent, - readonly _peers: PeersIndex, - ) { - } + readonly _peers: PeersIndex + ) {} /** * Event ID. @@ -560,7 +539,10 @@ export class ChatEvent { */ get actor(): User { if (!this._actor) { - this._actor = new User(this.client, this._peers.user(this.raw.userId)) + this._actor = new User( + this.client, + this._peers.user(this.raw.userId) + ) } return this._actor diff --git a/packages/client/src/types/peers/chat-invite-link.ts b/packages/client/src/types/peers/chat-invite-link.ts index be58fb82..4c5c16f5 100644 --- a/packages/client/src/types/peers/chat-invite-link.ts +++ b/packages/client/src/types/peers/chat-invite-link.ts @@ -1,9 +1,10 @@ +import { tl } from '@mtcute/tl' + import { makeInspectable } from '../utils' import { TelegramClient } from '../../client' -import { tl } from '@mtcute/tl' import { User } from './user' import { PeersIndex } from './index' -import { MtTypeAssertionError } from "../errors"; +import { MtTypeAssertionError } from '../errors' export namespace ChatInviteLink { export interface JoinedMember { @@ -45,7 +46,11 @@ export class ChatInviteLink { readonly _peers?: PeersIndex ) { if (raw._ === 'chatInvitePublicJoinRequests') { - throw new MtTypeAssertionError('ChatInviteLink', 'chatInviteExported', raw._) + throw new MtTypeAssertionError( + 'ChatInviteLink', + 'chatInviteExported', + raw._ + ) } this.raw = raw } diff --git a/packages/client/src/types/peers/chat-location.ts b/packages/client/src/types/peers/chat-location.ts index a651f67f..1820606a 100644 --- a/packages/client/src/types/peers/chat-location.ts +++ b/packages/client/src/types/peers/chat-location.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { Location } from '../media' import { makeInspectable } from '../utils' diff --git a/packages/client/src/types/peers/chat-member.ts b/packages/client/src/types/peers/chat-member.ts index e2df8c22..6aaf7395 100644 --- a/packages/client/src/types/peers/chat-member.ts +++ b/packages/client/src/types/peers/chat-member.ts @@ -1,6 +1,7 @@ +import { tl } from '@mtcute/tl' + import { makeInspectable } from '../utils' import { TelegramClient } from '../../client' -import { tl } from '@mtcute/tl' import { User } from './user' import { assertTypeIs } from '../../utils/type-assertion' import { ChatPermissions } from './chat-permissions' diff --git a/packages/client/src/types/peers/chat-photo.ts b/packages/client/src/types/peers/chat-photo.ts index a99a80f0..a71006f9 100644 --- a/packages/client/src/types/peers/chat-photo.ts +++ b/packages/client/src/types/peers/chat-photo.ts @@ -1,12 +1,13 @@ +import Long from 'long' +import { toggleChannelIdMark } from '@mtcute/core' import { tl } from '@mtcute/tl' +import { tdFileId, toFileId, toUniqueFileId } from '@mtcute/file-id' + import { FileLocation } from '../files' import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' import { strippedPhotoToJpg } from '../../utils/file-utils' -import { tdFileId, toFileId, toUniqueFileId } from '@mtcute/file-id' import { MtArgumentError } from '../errors' -import Long from 'long' -import { toggleChannelIdMark } from '@mtcute/core' /** * A size of a chat photo @@ -98,8 +99,8 @@ export class ChatPhotoSize extends FileLocation { id: this.obj.photoId, source: { _: 'dialogPhoto', - big: this.big - } as any + big: this.big, + } as any, } ) } diff --git a/packages/client/src/types/peers/chat-preview.ts b/packages/client/src/types/peers/chat-preview.ts index 8c7b1786..dbfd8d45 100644 --- a/packages/client/src/types/peers/chat-preview.ts +++ b/packages/client/src/types/peers/chat-preview.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' import { Photo } from '../media' diff --git a/packages/client/src/types/peers/chat.ts b/packages/client/src/types/peers/chat.ts index 0986fad0..748a70e7 100644 --- a/packages/client/src/types/peers/chat.ts +++ b/packages/client/src/types/peers/chat.ts @@ -1,8 +1,9 @@ -import { ChatPhoto } from './chat-photo' import { tl } from '@mtcute/tl' +import { getMarkedPeerId, MaybeArray } from '@mtcute/core' + +import { ChatPhoto } from './chat-photo' import { ChatPermissions } from './chat-permissions' import { TelegramClient } from '../../client' -import { getMarkedPeerId, MaybeArray } from '@mtcute/core' import { MtArgumentError, MtTypeAssertionError } from '../errors' import { makeInspectable } from '../utils' import { InputPeerLike, PeersIndex, User } from './index' diff --git a/packages/client/src/types/peers/peers-index.ts b/packages/client/src/types/peers/peers-index.ts index 4ec288e9..b3628ffc 100644 --- a/packages/client/src/types/peers/peers-index.ts +++ b/packages/client/src/types/peers/peers-index.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { MtArgumentError } from '../errors' const ERROR_MSG = diff --git a/packages/client/src/types/peers/user.ts b/packages/client/src/types/peers/user.ts index 46ff9ba6..a58254a6 100644 --- a/packages/client/src/types/peers/user.ts +++ b/packages/client/src/types/peers/user.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { TelegramClient } from '../../client' import { ChatPhoto } from './chat-photo' import { MtArgumentError } from '../errors' diff --git a/packages/client/src/types/updates/bot-chat-join-request.ts b/packages/client/src/types/updates/bot-chat-join-request.ts index db1f6316..17e3733a 100644 --- a/packages/client/src/types/updates/bot-chat-join-request.ts +++ b/packages/client/src/types/updates/bot-chat-join-request.ts @@ -1,7 +1,8 @@ -import { TelegramClient } from '../../client' -import { Chat, ChatInviteLink, PeersIndex, User } from '../peers' import { tl } from '@mtcute/tl' import { getBarePeerId, getMarkedPeerId } from '@mtcute/core' + +import { TelegramClient } from '../../client' +import { Chat, ChatInviteLink, PeersIndex, User } from '../peers' import { makeInspectable } from '../utils' /** diff --git a/packages/client/src/types/updates/bot-stopped.ts b/packages/client/src/types/updates/bot-stopped.ts index f055828f..24751623 100644 --- a/packages/client/src/types/updates/bot-stopped.ts +++ b/packages/client/src/types/updates/bot-stopped.ts @@ -1,5 +1,6 @@ -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' import { User, PeersIndex } from '../peers' @@ -23,7 +24,6 @@ export class BotStoppedUpdate { return this.raw.userId } - private _user?: User /** @@ -31,7 +31,10 @@ export class BotStoppedUpdate { */ get user(): User { if (!this._user) { - this._user = new User(this.client, this._peers.user(this.raw.userId)) + this._user = new User( + this.client, + this._peers.user(this.raw.userId) + ) } return this._user diff --git a/packages/client/src/types/updates/chat-join-request.ts b/packages/client/src/types/updates/chat-join-request.ts index 98014a16..73c29fe3 100644 --- a/packages/client/src/types/updates/chat-join-request.ts +++ b/packages/client/src/types/updates/chat-join-request.ts @@ -1,8 +1,9 @@ -import { TelegramClient } from '../../client' -import { ChatInviteLink, PeersIndex, User } from '../peers' import { tl } from '@mtcute/tl' import { getBarePeerId } from '@mtcute/core' +import { TelegramClient } from '../../client' +import { ChatInviteLink, PeersIndex, User } from '../peers' + /** * This update is sent when a user requests to join a chat * via invite link with approvals. diff --git a/packages/client/src/types/updates/chat-member-update.ts b/packages/client/src/types/updates/chat-member-update.ts index 934954dc..ed315b2e 100644 --- a/packages/client/src/types/updates/chat-member-update.ts +++ b/packages/client/src/types/updates/chat-member-update.ts @@ -1,12 +1,7 @@ import { tl } from '@mtcute/tl' -import { - Chat, - ChatInviteLink, - ChatMember, - PeersIndex, - User, -} from '../' + import { TelegramClient } from '../../client' +import { Chat, ChatInviteLink, ChatMember, PeersIndex, User } from '../' import { makeInspectable } from '../utils' // todo: check case when restricted user joins chat @@ -48,10 +43,11 @@ export namespace ChatMemberUpdate { export class ChatMemberUpdate { constructor( readonly client: TelegramClient, - readonly raw: tl.RawUpdateChatParticipant | tl.RawUpdateChannelParticipant, - readonly _peers: PeersIndex, - ) { - } + readonly raw: + | tl.RawUpdateChatParticipant + | tl.RawUpdateChannelParticipant, + readonly _peers: PeersIndex + ) {} /** * Date of the event @@ -182,7 +178,10 @@ export class ChatMemberUpdate { */ get actor(): User { if (!this._actor) { - this._actor = new User(this.client, this._peers.user(this.raw.actorId)) + this._actor = new User( + this.client, + this._peers.user(this.raw.actorId) + ) } return this._actor @@ -194,7 +193,10 @@ export class ChatMemberUpdate { */ get user(): User { if (!this._user) { - this._user = new User(this.client, this._peers.user(this.raw.userId)) + this._user = new User( + this.client, + this._peers.user(this.raw.userId) + ) } return this._user diff --git a/packages/client/src/types/updates/chosen-inline-result.ts b/packages/client/src/types/updates/chosen-inline-result.ts index 2343d15b..b5968627 100644 --- a/packages/client/src/types/updates/chosen-inline-result.ts +++ b/packages/client/src/types/updates/chosen-inline-result.ts @@ -1,11 +1,7 @@ import { tl } from '@mtcute/tl' -import { - User, - Location, - MtArgumentError, - PeersIndex, -} from '../' + import { TelegramClient } from '../../client' +import { User, Location, MtArgumentError, PeersIndex } from '../' import { encodeInlineMessageId } from '../../utils/inline-utils' import { makeInspectable } from '../utils' @@ -20,8 +16,7 @@ export class ChosenInlineResult { readonly client: TelegramClient, readonly raw: tl.RawUpdateBotInlineSend, readonly _peers: PeersIndex - ) { - } + ) {} /** * Unique identifier of the chosen result, @@ -37,7 +32,10 @@ export class ChosenInlineResult { */ get user(): User { if (!this._user) { - this._user = new User(this.client, this._peers.user(this.raw.userId)) + this._user = new User( + this.client, + this._peers.user(this.raw.userId) + ) } return this._user diff --git a/packages/client/src/types/updates/delete-message-update.ts b/packages/client/src/types/updates/delete-message-update.ts index db2308ef..f0766857 100644 --- a/packages/client/src/types/updates/delete-message-update.ts +++ b/packages/client/src/types/updates/delete-message-update.ts @@ -1,7 +1,8 @@ import { tl } from '@mtcute/tl' +import { toggleChannelIdMark } from '@mtcute/core' + import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' -import { toggleChannelIdMark } from '@mtcute/core' /** * One or more messages were deleted @@ -9,9 +10,10 @@ import { toggleChannelIdMark } from '@mtcute/core' export class DeleteMessageUpdate { constructor( readonly client: TelegramClient, - readonly raw: tl.RawUpdateDeleteMessages | tl.RawUpdateDeleteChannelMessages - ) { - } + readonly raw: + | tl.RawUpdateDeleteMessages + | tl.RawUpdateDeleteChannelMessages + ) {} /** * IDs of the messages which were deleted diff --git a/packages/client/src/types/updates/history-read-update.ts b/packages/client/src/types/updates/history-read-update.ts index 4931c752..9de47ccf 100644 --- a/packages/client/src/types/updates/history-read-update.ts +++ b/packages/client/src/types/updates/history-read-update.ts @@ -1,10 +1,11 @@ import { tl } from '@mtcute/tl' -import { TelegramClient } from '../../client' import { getMarkedPeerId, toggleChannelIdMark } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { makeInspectable } from '../utils' export class HistoryReadUpdate { - constructor ( + constructor( readonly client: TelegramClient, readonly raw: | tl.RawUpdateReadHistoryInbox diff --git a/packages/client/src/types/updates/index.ts b/packages/client/src/types/updates/index.ts index dadb3679..368f2480 100644 --- a/packages/client/src/types/updates/index.ts +++ b/packages/client/src/types/updates/index.ts @@ -28,20 +28,20 @@ export { // begin-codegen export type ParsedUpdate = - | { name: 'new_message', data: Message } - | { name: 'edit_message', data: Message } - | { name: 'delete_message', data: DeleteMessageUpdate } - | { name: 'chat_member', data: ChatMemberUpdate } - | { name: 'inline_query', data: InlineQuery } - | { name: 'chosen_inline_result', data: ChosenInlineResult } - | { name: 'callback_query', data: CallbackQuery } - | { name: 'poll', data: PollUpdate } - | { name: 'poll_vote', data: PollVoteUpdate } - | { name: 'user_status', data: UserStatusUpdate } - | { name: 'user_typing', data: UserTypingUpdate } - | { name: 'history_read', data: HistoryReadUpdate } - | { name: 'bot_stopped', data: BotStoppedUpdate } - | { name: 'bot_chat_join_request', data: BotChatJoinRequestUpdate } - | { name: 'chat_join_request', data: ChatJoinRequestUpdate } + | { name: 'new_message'; data: Message } + | { name: 'edit_message'; data: Message } + | { name: 'delete_message'; data: DeleteMessageUpdate } + | { name: 'chat_member'; data: ChatMemberUpdate } + | { name: 'inline_query'; data: InlineQuery } + | { name: 'chosen_inline_result'; data: ChosenInlineResult } + | { name: 'callback_query'; data: CallbackQuery } + | { name: 'poll'; data: PollUpdate } + | { name: 'poll_vote'; data: PollVoteUpdate } + | { name: 'user_status'; data: UserStatusUpdate } + | { name: 'user_typing'; data: UserTypingUpdate } + | { name: 'history_read'; data: HistoryReadUpdate } + | { name: 'bot_stopped'; data: BotStoppedUpdate } + | { name: 'bot_chat_join_request'; data: BotChatJoinRequestUpdate } + | { name: 'chat_join_request'; data: ChatJoinRequestUpdate } // end-codegen diff --git a/packages/client/src/types/updates/poll-update.ts b/packages/client/src/types/updates/poll-update.ts index 9a242c3e..79295ee2 100644 --- a/packages/client/src/types/updates/poll-update.ts +++ b/packages/client/src/types/updates/poll-update.ts @@ -1,6 +1,7 @@ -import { PeersIndex, Poll } from '../' -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' +import { PeersIndex, Poll } from '../' import { makeInspectable } from '../utils' /** @@ -15,8 +16,7 @@ export class PollUpdate { readonly client: TelegramClient, readonly raw: tl.RawUpdateMessagePoll, readonly _peers: PeersIndex - ) { - } + ) {} /** * Unique poll ID diff --git a/packages/client/src/types/updates/poll-vote.ts b/packages/client/src/types/updates/poll-vote.ts index 917701fa..c912f87c 100644 --- a/packages/client/src/types/updates/poll-vote.ts +++ b/packages/client/src/types/updates/poll-vote.ts @@ -14,8 +14,7 @@ export class PollVoteUpdate { readonly client: TelegramClient, readonly raw: tl.RawUpdateMessagePollVote, readonly _peers: PeersIndex - ) { - } + ) {} /** * Unique poll ID @@ -30,7 +29,10 @@ export class PollVoteUpdate { */ get user(): User { if (!this._user) { - this._user = new User(this.client, this._peers.user(this.raw.userId)) + this._user = new User( + this.client, + this._peers.user(this.raw.userId) + ) } return this._user diff --git a/packages/client/src/types/updates/user-status-update.ts b/packages/client/src/types/updates/user-status-update.ts index 896e52af..76e3d839 100644 --- a/packages/client/src/types/updates/user-status-update.ts +++ b/packages/client/src/types/updates/user-status-update.ts @@ -1,6 +1,7 @@ -import { User } from '../' -import { TelegramClient } from '../../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../../client' +import { User } from '../' import { makeInspectable } from '../utils' /** diff --git a/packages/client/src/types/updates/user-typing-update.ts b/packages/client/src/types/updates/user-typing-update.ts index af053a77..a8ce69e7 100644 --- a/packages/client/src/types/updates/user-typing-update.ts +++ b/packages/client/src/types/updates/user-typing-update.ts @@ -1,3 +1,7 @@ +import { tl } from '@mtcute/tl' +import { getBarePeerId, toggleChannelIdMark } from '@mtcute/core' + +import { TelegramClient } from '../../client' import { BasicPeerType, Chat, @@ -5,9 +9,6 @@ import { User, TypingStatus, } from '../' -import { TelegramClient } from '../../client' -import { tl } from '@mtcute/tl' -import { getBarePeerId, toggleChannelIdMark } from '@mtcute/core' import { makeInspectable } from '../utils' /** @@ -22,17 +23,15 @@ export class UserTypingUpdate { | tl.RawUpdateUserTyping | tl.RawUpdateChatUserTyping | tl.RawUpdateChannelUserTyping - ) { - } + ) {} /** * ID of the user whose typing status changed */ get userId(): number { - return (this.raw._ === 'updateUserTyping' + return this.raw._ === 'updateUserTyping' ? this.raw.userId : getBarePeerId(this.raw.fromId) - ) } /** diff --git a/packages/client/src/types/utils.ts b/packages/client/src/types/utils.ts index 95d58db5..f25965a3 100644 --- a/packages/client/src/types/utils.ts +++ b/packages/client/src/types/utils.ts @@ -30,7 +30,9 @@ function getAllGettersNames(obj: object): string[] { } const bufferToJsonOriginal = Buffer.prototype.toJSON -const bufferToJsonInspect = function (this: Buffer) { return this.toString('base64') } +const bufferToJsonInspect = function (this: Buffer) { + return this.toString('base64') +} /** * Small helper function that adds `toJSON` and `util.custom.inspect` @@ -56,7 +58,7 @@ export function makeInspectable( obj.prototype.toJSON = function (nested = false) { if (!nested) { - (Buffer as any).toJSON = bufferToJsonInspect + ;(Buffer as any).toJSON = bufferToJsonInspect } const ret: any = Object.create(proto) @@ -72,7 +74,7 @@ export function makeInspectable( } ret[it] = val } catch (e: any) { - ret[it] = "Error: " + e.message + ret[it] = 'Error: ' + e.message } }) diff --git a/packages/client/src/utils/inline-utils.ts b/packages/client/src/utils/inline-utils.ts index a18324b3..124bd53a 100644 --- a/packages/client/src/utils/inline-utils.ts +++ b/packages/client/src/utils/inline-utils.ts @@ -4,8 +4,8 @@ import { encodeUrlSafeBase64, parseUrlSafeBase64, TlBinaryReader, - TlBinaryWriter -} from "@mtcute/core"; + TlBinaryWriter, +} from '@mtcute/core' export function parseInlineMessageId( id: string @@ -27,7 +27,7 @@ export function parseInlineMessageId( dcId: reader.int(), ownerId: reader.long(), id: reader.int(), - accessHash: reader.long() + accessHash: reader.long(), } } diff --git a/packages/client/src/utils/misc-utils.ts b/packages/client/src/utils/misc-utils.ts index e41e2df9..2dae7db4 100644 --- a/packages/client/src/utils/misc-utils.ts +++ b/packages/client/src/utils/misc-utils.ts @@ -1,6 +1,7 @@ -import { MaybeDynamic, Message, MtClientError } from '../types' import { tl } from '@mtcute/tl' +import { MaybeDynamic, Message, MtClientError } from '../types' + export function normalizePhoneNumber(phone: string): string { phone = phone.trim().replace(/[+()\s-]/g, '') if (!phone.match(/^\d+$/)) throw new MtClientError('Invalid phone number') diff --git a/packages/client/src/utils/parse-update.ts b/packages/client/src/utils/parse-update.ts index 7fe95b46..600224b5 100644 --- a/packages/client/src/utils/parse-update.ts +++ b/packages/client/src/utils/parse-update.ts @@ -1,26 +1,29 @@ -import { TelegramClient } from '../client' import { tl } from '@mtcute/tl' + +import { TelegramClient } from '../client' import { BotChatJoinRequestUpdate, BotStoppedUpdate, - CallbackQuery, ChatJoinRequestUpdate, + CallbackQuery, + ChatJoinRequestUpdate, ChatMemberUpdate, ChosenInlineResult, DeleteMessageUpdate, HistoryReadUpdate, InlineQuery, Message, - ParsedUpdate, PeersIndex, + ParsedUpdate, + PeersIndex, PollUpdate, PollVoteUpdate, UserStatusUpdate, - UserTypingUpdate -} from "../types"; + UserTypingUpdate, +} from '../types' type ParserFunction = ( client: TelegramClient, upd: tl.TypeUpdate | tl.TypeMessage, - peers: PeersIndex, + peers: PeersIndex ) => any type UpdateParser = [ParsedUpdate['name'], ParserFunction] @@ -40,8 +43,7 @@ const newMessageParser: UpdateParser = ['new_message', baseMessageParser] const editMessageParser: UpdateParser = ['edit_message', baseMessageParser] const chatMemberParser: UpdateParser = [ 'chat_member', - (client, upd, peers) => - new ChatMemberUpdate(client, upd as any, peers), + (client, upd, peers) => new ChatMemberUpdate(client, upd as any, peers), ] const callbackQueryParser: UpdateParser = [ 'callback_query', @@ -113,12 +115,14 @@ const PARSERS: Partial< ], updateBotChatInviteRequester: [ 'bot_chat_join_request', - (client, upd, peers) => new BotChatJoinRequestUpdate(client, upd as any, peers), + (client, upd, peers) => + new BotChatJoinRequestUpdate(client, upd as any, peers), ], updatePendingJoinRequests: [ 'chat_join_request', - (client, upd, peers) => new ChatJoinRequestUpdate(client, upd as any, peers), - ] + (client, upd, peers) => + new ChatJoinRequestUpdate(client, upd as any, peers), + ], } /** @internal */ diff --git a/packages/client/src/utils/peer-utils.ts b/packages/client/src/utils/peer-utils.ts index 779486a8..abbe0996 100644 --- a/packages/client/src/utils/peer-utils.ts +++ b/packages/client/src/utils/peer-utils.ts @@ -1,8 +1,9 @@ -import { assertNever } from '@mtcute/core' -import { tl } from '@mtcute/tl' import Long from 'long' +import { tl } from '@mtcute/tl' +import { assertNever } from '@mtcute/core' -export const INVITE_LINK_REGEX = /^(?:https?:\/\/)?(?:www\.)?(?:t(?:elegram)?\.(?:org|me|dog)\/(?:joinchat\/|\+))([\w-]+)$/i +export const INVITE_LINK_REGEX = + /^(?:https?:\/\/)?(?:www\.)?(?:t(?:elegram)?\.(?:org|me|dog)\/(?:joinchat\/|\+))([\w-]+)$/i // helpers to normalize result of `resolvePeer` function diff --git a/packages/client/src/utils/rps-meter.ts b/packages/client/src/utils/rps-meter.ts index 48e2ebf8..548f88c2 100644 --- a/packages/client/src/utils/rps-meter.ts +++ b/packages/client/src/utils/rps-meter.ts @@ -9,7 +9,7 @@ export class RpsMeter { throw new Error('RPS meter is not supported on this platform') this._hits = new Deque(size) - this.time = BigInt(time) * BigInt(1e+6) + this.time = BigInt(time) * BigInt(1e6) } hit(): void { @@ -36,6 +36,6 @@ export class RpsMeter { const hits = this._hits.length - idx // average load per second - return hits * 1e9 / Number(now - first.value) + return (hits * 1e9) / Number(now - first.value) } } diff --git a/packages/client/src/utils/type-assertion.ts b/packages/client/src/utils/type-assertion.ts index ec761747..37bdf1db 100644 --- a/packages/client/src/utils/type-assertion.ts +++ b/packages/client/src/utils/type-assertion.ts @@ -1,6 +1,7 @@ -import { MtTypeAssertionError } from '../types' import { tl } from '@mtcute/tl' +import { MtTypeAssertionError } from '../types' + export function assertTypeIs( context: string, obj: T, diff --git a/packages/client/src/utils/updates-utils.ts b/packages/client/src/utils/updates-utils.ts index 1191c899..045d58ce 100644 --- a/packages/client/src/utils/updates-utils.ts +++ b/packages/client/src/utils/updates-utils.ts @@ -1,4 +1,5 @@ import { tl } from '@mtcute/tl' + import { MtTypeAssertionError } from '../types' // dummy updates which are used for methods that return messages.affectedHistory. diff --git a/packages/client/src/utils/voice-utils.ts b/packages/client/src/utils/voice-utils.ts index 3d0e2bc1..197c4f50 100644 --- a/packages/client/src/utils/voice-utils.ts +++ b/packages/client/src/utils/voice-utils.ts @@ -6,7 +6,7 @@ export function decodeWaveform(wf: Buffer): number[] { const lastIdx = valuesCount - 1 - // Read each 5 bit of encoded5bit as 0-31 unsigned char. + // Read each 5 bit of encoded 5bit as 0-31 unsigned char. // We count the index of the byte in which the desired 5-bit sequence starts. // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits. // @@ -33,7 +33,6 @@ export function decodeWaveform(wf: Buffer): number[] { return result } - export function encodeWaveform(wf: number[]): Buffer { const bitsCount = wf.length * 5 const bytesCount = ~~(bitsCount + 7) / 8 diff --git a/packages/core/.env b/packages/core/.env deleted file mode 100644 index 9a9a8765..00000000 --- a/packages/core/.env +++ /dev/null @@ -1,9 +0,0 @@ -# These env variables are only used in e2e tests - -# API ID and Hash (obviously) -API_ID= -API_HASH= - -# Bot token (from test DC!) -BOT_USERNAME= -BOT_TOKEN= diff --git a/packages/core/package.json b/packages/core/package.json index 0c891fcd..b88cda5a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -7,7 +7,7 @@ "license": "LGPL-3.0", "main": "src/index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "build": "tsc", "docs": "npx typedoc" }, diff --git a/packages/core/scripts/get-user-token-for-e2e.ts b/packages/core/scripts/get-user-token-for-e2e.ts deleted file mode 100644 index f126e5f7..00000000 --- a/packages/core/scripts/get-user-token-for-e2e.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { BaseTelegramClient, defaultDcs } from '../src' - -require('dotenv-flow').config({ path: __dirname + '/../' }) - -if (!process.env.API_ID || !process.env.API_HASH) { - console.warn('Set API_ID and API_HASH env variables') - process.exit(0) -} - -const dcId = process.argv[2] ?? '2' - -const tg = new BaseTelegramClient({ - apiId: process.env.API_ID, - apiHash: process.env.API_HASH, - primaryDc: defaultDcs.defaultTestDc, -}) - -;(async () => { - await tg.connect() - - let numbers = Math.floor(Math.random() * 9999).toString() - while (numbers.length !== 4) numbers += '0' - - const phone = `99966${dcId}${numbers}` - const code = `${dcId}${dcId}${dcId}${dcId}${dcId}${dcId}` - - const res = await tg.call({ - _: 'auth.sendCode', - phoneNumber: phone, - apiId: tg['_initConnectionParams'].apiId, - apiHash: tg['_apiHash'], - settings: { _: 'codeSettings' }, - }) - - const res1 = await tg.call({ - _: 'auth.signIn', - phoneNumber: phone, - phoneCodeHash: res.phoneCodeHash, - phoneCode: code, - }) - - if (res1._ === 'auth.authorizationSignUpRequired') { - await tg.call({ - _: 'auth.signUp', - phoneNumber: phone, - phoneCodeHash: res.phoneCodeHash, - firstName: 'MTCute E2E', - lastName: '', - }) - } - - const username = `mtcute_e2e_${numbers}` - - await tg.call({ - _: 'account.updateUsername', - username, - }) - - console.log('User %s, DC %d: %s', username, dcId, await tg.exportSession()) -})().catch(console.error) diff --git a/packages/core/src/base-client.ts b/packages/core/src/base-client.ts index 211cac32..1214a50f 100644 --- a/packages/core/src/base-client.ts +++ b/packages/core/src/base-client.ts @@ -1,4 +1,13 @@ +import Long from 'long' +import EventEmitter from 'events' import { tl } from '@mtcute/tl' +import { + TlBinaryReader, + TlBinaryWriter, + TlReaderMap, + TlWriterMap, +} from '@mtcute/tl-runtime' + import { CryptoProviderFactory, ICryptoProvider, @@ -9,7 +18,14 @@ import { parseUrlSafeBase64, LogManager, toggleChannelIdMark, + defaultProductionDc, + defaultProductionIpv6Dc, + defaultTestDc, + defaultTestIpv6Dc, + ControllablePromise, + createControllablePromise, } from './utils' +import { addPublicKey } from './utils/crypto/keys' import { TransportFactory, defaultReconnectionStrategy, @@ -18,26 +34,7 @@ import { SessionConnection, } from './network' import { PersistentConnectionParams } from './network/persistent-connection' -import { - defaultProductionDc, - defaultProductionIpv6Dc, - defaultTestDc, - defaultTestIpv6Dc, -} from './utils/default-dcs' -import { addPublicKey } from './utils/crypto/keys' import { ITelegramStorage, MemoryStorage } from './storage' -import EventEmitter from 'events' -import Long from 'long' -import { - ControllablePromise, - createControllablePromise, -} from './utils/controllable-promise' -import { - TlBinaryReader, - TlBinaryWriter, - TlReaderMap, - TlWriterMap, -} from '@mtcute/tl-runtime' import defaultReaderMap from '@mtcute/tl/binary/reader' import defaultWriterMap from '@mtcute/tl/binary/writer' diff --git a/packages/core/src/network/authorization.ts b/packages/core/src/network/authorization.ts index 2c70565a..911c4352 100644 --- a/packages/core/src/network/authorization.ts +++ b/packages/core/src/network/authorization.ts @@ -1,16 +1,6 @@ -import { - buffersEqual, - randomBytes, - xorBuffer, - xorBufferInPlace, -} from '../utils/buffer-utils' -import { mtp } from '@mtcute/tl' -import { ICryptoProvider, bigIntToBuffer, bufferToBigInt } from '../utils' -import { findKeyByFingerprints } from '../utils/crypto/keys' import bigInt from 'big-integer' -import { generateKeyAndIvFromNonce } from '../utils/crypto/mtproto' -import { SessionConnection } from './session-connection' import Long from 'long' +import { mtp } from '@mtcute/tl' import { TlBinaryReader, TlBinaryWriter, @@ -18,6 +8,17 @@ import { } from '@mtcute/tl-runtime' import { TlPublicKey } from '@mtcute/tl/binary/rsa-keys' +import { findKeyByFingerprints } from '../utils/crypto/keys' +import { generateKeyAndIvFromNonce } from '../utils/crypto/mtproto' +import { + buffersEqual, + randomBytes, + xorBuffer, + xorBufferInPlace, +} from '../utils/buffer-utils' +import { ICryptoProvider, bigIntToBuffer, bufferToBigInt } from '../utils' +import { SessionConnection } from './session-connection' + // Heavily based on code from https://github.com/LonamiWebs/Telethon/blob/master/telethon/network/authenticator.py const DH_SAFETY_RANGE = bigInt[2].pow(2048 - 64) diff --git a/packages/core/src/network/mtproto-session.ts b/packages/core/src/network/mtproto-session.ts index c1232035..106c04da 100644 --- a/packages/core/src/network/mtproto-session.ts +++ b/packages/core/src/network/mtproto-session.ts @@ -1,9 +1,16 @@ -import { buffersEqual, randomBytes } from '../utils/buffer-utils' -import { mtp, tl } from '@mtcute/tl' -import { createAesIgeForMessage } from '../utils/crypto/mtproto' -import { ICryptoProvider, Logger, getRandomInt, randomLong } from '../utils' import Long from 'long' -import { TlBinaryReader, TlBinaryWriter, TlReaderMap, TlSerializationCounter, TlWriterMap } from '@mtcute/tl-runtime' +import { mtp, tl } from '@mtcute/tl' +import { + TlBinaryReader, + TlBinaryWriter, + TlReaderMap, + TlSerializationCounter, + TlWriterMap, +} from '@mtcute/tl-runtime' + +import { createAesIgeForMessage } from '../utils/crypto/mtproto' +import { buffersEqual, randomBytes } from '../utils/buffer-utils' +import { ICryptoProvider, Logger, getRandomInt, randomLong } from '../utils' /** * Class encapsulating a single MTProto session. @@ -108,11 +115,7 @@ export class MtprotoSession { /** Decrypt a single MTProto message using session's keys */ async decryptMessage( data: Buffer, - callback: ( - msgId: tl.Long, - seqNo: number, - data: TlBinaryReader - ) => void + callback: (msgId: tl.Long, seqNo: number, data: TlBinaryReader) => void ): Promise { if (!this._authKey) throw new Error('Keys are not set up!') @@ -246,7 +249,10 @@ export class MtprotoSession { const length = Buffer.isBuffer(content) ? content.length - : TlSerializationCounter.countNeededBytes(writer.objectMap!, content) + : TlSerializationCounter.countNeededBytes( + writer.objectMap!, + content + ) writer.long(messageId) writer.int(seqNo) diff --git a/packages/core/src/network/persistent-connection.ts b/packages/core/src/network/persistent-connection.ts index 0bcf796d..dbd7f928 100644 --- a/packages/core/src/network/persistent-connection.ts +++ b/packages/core/src/network/persistent-connection.ts @@ -1,12 +1,17 @@ import EventEmitter from 'events' -import { ITelegramTransport, TransportFactory, TransportState } from './transports' import { tl } from '@mtcute/tl' -import { ReconnectionStrategy } from './reconnection' + import { ControllablePromise, createControllablePromise, } from '../utils/controllable-promise' import { ICryptoProvider, Logger } from '../utils' +import { ReconnectionStrategy } from './reconnection' +import { + ITelegramTransport, + TransportFactory, + TransportState, +} from './transports' export interface PersistentConnectionParams { crypto: ICryptoProvider @@ -49,7 +54,10 @@ export abstract class PersistentConnection extends EventEmitter { protected abstract onMessage(data: Buffer): void - protected constructor(params: PersistentConnectionParams, readonly log: Logger) { + protected constructor( + params: PersistentConnectionParams, + readonly log: Logger + ) { super() this.params = params this.changeTransport(params.transportFactory) diff --git a/packages/core/src/network/session-connection.ts b/packages/core/src/network/session-connection.ts index 052a1008..a35941f4 100644 --- a/packages/core/src/network/session-connection.ts +++ b/packages/core/src/network/session-connection.ts @@ -1,23 +1,33 @@ +import Long from 'long' +import { mtp, tl } from '@mtcute/tl' +import { + TlBinaryReader, + TlBinaryWriter, + TlReaderMap, + TlSerializationCounter, + TlWriterMap, +} from '@mtcute/tl-runtime' +import { gzipDeflate, gzipInflate } from '@mtcute/tl-runtime/src/platform/gzip' + +import { + Logger, + LongMap, + randomLong, + removeFromLongArray, + Deque, + LruSet, + SortedArray, + EarlyTimer, + ControllablePromise, + createCancellablePromise, +} from '../utils' +import { MtprotoSession } from './mtproto-session' +import { doAuthorization } from './authorization' +import { TransportError } from './transports' import { PersistentConnection, PersistentConnectionParams, } from './persistent-connection' -import { mtp, tl } from '@mtcute/tl' -import { Logger, LongMap, randomLong, removeFromLongArray } from '../utils' -import { MtprotoSession } from './mtproto-session' -import { doAuthorization } from './authorization' -import { TransportError } from './transports' -import Long from 'long' -import { LruSet } from '../utils/lru-string-set' -import { - ControllablePromise, - createCancellablePromise, -} from '../utils/controllable-promise' -import { gzipDeflate, gzipInflate } from '@mtcute/tl-runtime/src/platform/gzip' -import { SortedArray } from '../utils/sorted-array' -import { EarlyTimer } from '../utils/early-timer' -import { Deque } from '../utils' -import { TlBinaryReader, TlBinaryWriter, TlReaderMap, TlSerializationCounter, TlWriterMap } from '@mtcute/tl-runtime' export interface SessionConnectionParams extends PersistentConnectionParams { initConnection: tl.RawInitConnectionRequest @@ -91,7 +101,11 @@ type PendingMessage = // todo const DESTROY_SESSION_ID = Buffer.from('262151e7', 'hex') -function makeNiceStack(error: tl.errors.RpcError, stack: string, method?: string) { +function makeNiceStack( + error: tl.errors.RpcError, + stack: string, + method?: string +) { error.stack = `${error.constructor.name} (${error.code} ${error.text}): ${ error.message }\n at ${method}\n${stack.split('\n').slice(2).join('\n')}` @@ -372,10 +386,7 @@ export class SessionConnection extends PersistentConnection { this._handleMessage(messageId, message.object()) } - private _handleMessage( - messageId: Long, - message: mtp.TlObject - ): void { + private _handleMessage(messageId: Long, message: mtp.TlObject): void { if (messageId.isEven()) { this.log.warn( 'warn: ignoring message with invalid messageId = %s (is even)', @@ -1051,7 +1062,7 @@ export class SessionConnection extends PersistentConnection { this.log.verbose('>>> %j', obj) - let content = TlBinaryWriter.serializeObject(this._writerMap,obj) + let content = TlBinaryWriter.serializeObject(this._writerMap, obj) if (content.length > 1044404) { // if you send larger payloads, telegram will just close connection, @@ -1299,7 +1310,10 @@ export class SessionConnection extends PersistentConnection { msgIds: getStateMsgIds, } - getStateRequest = TlBinaryWriter.serializeObject(this._writerMap, obj) + getStateRequest = TlBinaryWriter.serializeObject( + this._writerMap, + obj + ) packetSize += getStateRequest.length + 16 messageCount += 1 } diff --git a/packages/core/src/network/transports/abstract.ts b/packages/core/src/network/transports/abstract.ts index ce4a79b5..aa265194 100644 --- a/packages/core/src/network/transports/abstract.ts +++ b/packages/core/src/network/transports/abstract.ts @@ -1,7 +1,8 @@ +import EventEmitter from 'events' import { tl } from '@mtcute/tl' + import { MaybeAsync } from '../../types' import { ICryptoProvider, Logger } from '../../utils' -import EventEmitter from 'events' export enum TransportState { /** diff --git a/packages/core/src/network/transports/index.ts b/packages/core/src/network/transports/index.ts index b1552808..96be65eb 100644 --- a/packages/core/src/network/transports/index.ts +++ b/packages/core/src/network/transports/index.ts @@ -11,4 +11,5 @@ export * from './obfuscated' import { _defaultTransportFactory } from '../../utils/platform/transport' /** Platform-defined default transport factory */ -export const defaultTransportFactory: TransportFactory = _defaultTransportFactory +export const defaultTransportFactory: TransportFactory = + _defaultTransportFactory diff --git a/packages/core/src/network/transports/intermediate.ts b/packages/core/src/network/transports/intermediate.ts index 37326c68..654a170c 100644 --- a/packages/core/src/network/transports/intermediate.ts +++ b/packages/core/src/network/transports/intermediate.ts @@ -1,6 +1,6 @@ +import { randomBytes } from '../../utils' import { IPacketCodec, TransportError } from './abstract' import { StreamedCodec } from './streamed' -import { randomBytes } from '../../utils/buffer-utils' const TAG = Buffer.from([0xee, 0xee, 0xee, 0xee]) const PADDED_TAG = Buffer.from([0xdd, 0xdd, 0xdd, 0xdd]) @@ -11,7 +11,8 @@ const PADDED_TAG = Buffer.from([0xdd, 0xdd, 0xdd, 0xdd]) */ export class IntermediatePacketCodec extends StreamedCodec - implements IPacketCodec { + implements IPacketCodec +{ tag(): Buffer { return TAG } diff --git a/packages/core/src/network/transports/obfuscated.ts b/packages/core/src/network/transports/obfuscated.ts index 799d83ca..011bf6c7 100644 --- a/packages/core/src/network/transports/obfuscated.ts +++ b/packages/core/src/network/transports/obfuscated.ts @@ -1,6 +1,5 @@ +import { buffersEqual, randomBytes, IEncryptionScheme } from '../../utils' import { IPacketCodec } from './abstract' -import { IEncryptionScheme } from '../../utils/crypto' -import { buffersEqual, randomBytes } from '../../utils/buffer-utils' import { WrappedCodec } from './wrapped' // initial payload can't start with these @@ -19,7 +18,10 @@ interface MtProxyInfo { media: boolean } -export class ObfuscatedPacketCodec extends WrappedCodec implements IPacketCodec { +export class ObfuscatedPacketCodec + extends WrappedCodec + implements IPacketCodec +{ private _encryptor?: IEncryptionScheme private _decryptor?: IEncryptionScheme diff --git a/packages/core/src/network/transports/tcp.ts b/packages/core/src/network/transports/tcp.ts index f1411a2a..83c04d54 100644 --- a/packages/core/src/network/transports/tcp.ts +++ b/packages/core/src/network/transports/tcp.ts @@ -1,8 +1,9 @@ -import { ITelegramTransport, IPacketCodec, TransportState } from './abstract' -import { tl } from '@mtcute/tl' -import { Socket, connect } from 'net' import EventEmitter from 'events' +import { Socket, connect } from 'net' +import { tl } from '@mtcute/tl' + import { ICryptoProvider, Logger } from '../../utils' +import { ITelegramTransport, IPacketCodec, TransportState } from './abstract' import { IntermediatePacketCodec } from './intermediate' /** @@ -11,7 +12,8 @@ import { IntermediatePacketCodec } from './intermediate' */ export abstract class BaseTcpTransport extends EventEmitter - implements ITelegramTransport { + implements ITelegramTransport +{ protected _currentDc: tl.RawDcOption | null = null protected _state: TransportState = TransportState.Idle protected _socket: Socket | null = null diff --git a/packages/core/src/network/transports/websocket.ts b/packages/core/src/network/transports/websocket.ts index 6f600905..37be30dd 100644 --- a/packages/core/src/network/transports/websocket.ts +++ b/packages/core/src/network/transports/websocket.ts @@ -1,10 +1,11 @@ -import { ITelegramTransport, IPacketCodec, TransportState } from './abstract' -import { tl } from '@mtcute/tl' -import EventEmitter from 'events' import type WebSocket from 'ws' +import EventEmitter from 'events' +import { tl } from '@mtcute/tl' + +import { typedArrayToBuffer, Logger, ICryptoProvider } from '../../utils' +import { ITelegramTransport, IPacketCodec, TransportState } from './abstract' import { IntermediatePacketCodec } from './intermediate' import { ObfuscatedPacketCodec } from './obfuscated' -import { typedArrayToBuffer, Logger, ICryptoProvider } from '../../utils' let ws: { new (address: string, options?: string): WebSocket @@ -33,7 +34,8 @@ const subdomainsMap: Record = { */ export abstract class BaseWebSocketTransport extends EventEmitter - implements ITelegramTransport { + implements ITelegramTransport +{ private _currentDc: tl.RawDcOption | null = null private _state: TransportState = TransportState.Idle private _socket: WebSocket | null = null @@ -50,10 +52,7 @@ export abstract class BaseWebSocketTransport * @param baseDomain Base WebSocket domain * @param subdomains Map of sub-domains (key is DC ID, value is string) */ - constructor( - baseDomain = 'web.telegram.org', - subdomains = subdomainsMap - ) { + constructor(baseDomain = 'web.telegram.org', subdomains = subdomainsMap) { super() if (!ws) @@ -69,7 +68,9 @@ export abstract class BaseWebSocketTransport private _updateLogPrefix() { if (this._currentDc) { - this.log.prefix = `[WS:${this._subdomains[this._currentDc.id]}.${this._baseDomain}] ` + this.log.prefix = `[WS:${this._subdomains[this._currentDc.id]}.${ + this._baseDomain + }] ` } else { this.log.prefix = '[WS:disconnected] ' } diff --git a/packages/core/src/network/transports/wrapped.ts b/packages/core/src/network/transports/wrapped.ts index 27e08560..aac36bca 100644 --- a/packages/core/src/network/transports/wrapped.ts +++ b/packages/core/src/network/transports/wrapped.ts @@ -1,6 +1,7 @@ import EventEmitter from 'events' -import { IPacketCodec } from './abstract' + import { ICryptoProvider, Logger } from '../../utils' +import { IPacketCodec } from './abstract' export abstract class WrappedCodec extends EventEmitter { protected _crypto!: ICryptoProvider diff --git a/packages/core/src/storage/abstract.ts b/packages/core/src/storage/abstract.ts index bf164078..ac6251c0 100644 --- a/packages/core/src/storage/abstract.ts +++ b/packages/core/src/storage/abstract.ts @@ -1,8 +1,9 @@ -import { BasicPeerType, MaybeAsync } from '../types' import { tl } from '@mtcute/tl' -import { Logger } from '../utils' import { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime' +import { Logger } from '../utils' +import { BasicPeerType, MaybeAsync } from '../types' + export namespace ITelegramStorage { export interface PeerInfo { // marked id diff --git a/packages/core/src/storage/json.ts b/packages/core/src/storage/json.ts index de0384e4..046b1576 100644 --- a/packages/core/src/storage/json.ts +++ b/packages/core/src/storage/json.ts @@ -1,5 +1,5 @@ -import { MemoryStorage } from './memory' import { longFromFastString, longToFastString } from '../utils' +import { MemoryStorage } from './memory' /** * Helper class that provides json serialization functions diff --git a/packages/core/src/storage/memory.ts b/packages/core/src/storage/memory.ts index 3c0c611d..5af11331 100644 --- a/packages/core/src/storage/memory.ts +++ b/packages/core/src/storage/memory.ts @@ -1,7 +1,8 @@ -import { ITelegramStorage } from './abstract' -import { MaybeAsync } from '../types' import { tl } from '@mtcute/tl' + import { LruMap, toggleChannelIdMark } from '../utils' +import { MaybeAsync } from '../types' +import { ITelegramStorage } from './abstract' const CURRENT_VERSION = 1 @@ -38,12 +39,15 @@ interface MemorySessionState { > // state for rate limiter - rl: Record + rl: Record< + string, + { + // reset + res: number + // remaining + rem: number + } + > self: ITelegramStorage.SelfInfo | null } @@ -52,7 +56,9 @@ const USERNAME_TTL = 86400000 // 24 hours export class MemoryStorage implements ITelegramStorage /*, IStateStorage */ { protected _state!: MemorySessionState - private _cachedInputPeers: LruMap = new LruMap(100) + private _cachedInputPeers: LruMap = new LruMap( + 100 + ) private _cachedFull: LruMap diff --git a/packages/core/src/utils/async-lock.ts b/packages/core/src/utils/async-lock.ts index a3fb8399..0fa77a8a 100644 --- a/packages/core/src/utils/async-lock.ts +++ b/packages/core/src/utils/async-lock.ts @@ -24,8 +24,7 @@ export class AsyncLock { } release(): void { - if (!this._queue.length) - throw new Error('Nothing to release') + if (!this._queue.length) throw new Error('Nothing to release') this._queue.popFront()![1]() } diff --git a/packages/core/src/utils/bigint-utils.ts b/packages/core/src/utils/bigint-utils.ts index 09c48770..3eb6f56b 100644 --- a/packages/core/src/utils/bigint-utils.ts +++ b/packages/core/src/utils/bigint-utils.ts @@ -1,4 +1,5 @@ import bigInt, { BigInteger } from 'big-integer' + import { randomBytes } from './buffer-utils' export function bigIntToBuffer( @@ -39,7 +40,10 @@ export function randomBigInt(size: number): BigInteger { return bufferToBigInt(randomBytes(size)) } -export function randomBigIntInRange(max: BigInteger, min = bigInt.one): BigInteger { +export function randomBigIntInRange( + max: BigInteger, + min = bigInt.one +): BigInteger { const interval = max.minus(min) if (interval.isNegative()) throw new Error('expected min < max') diff --git a/packages/core/src/utils/condition-variable.ts b/packages/core/src/utils/condition-variable.ts index 7ffd49b3..66d7e257 100644 --- a/packages/core/src/utils/condition-variable.ts +++ b/packages/core/src/utils/condition-variable.ts @@ -3,7 +3,7 @@ export class ConditionVariable { private _timeout?: NodeJS.Timeout wait(timeout?: number): Promise { - const prom = new Promise((resolve) =>{ + const prom = new Promise((resolve) => { this._notify = resolve }) diff --git a/packages/core/src/utils/controllable-promise.ts b/packages/core/src/utils/controllable-promise.ts index ce60d93a..a56ab430 100644 --- a/packages/core/src/utils/controllable-promise.ts +++ b/packages/core/src/utils/controllable-promise.ts @@ -25,7 +25,7 @@ export function createCancellablePromise( onCancel: () => void ): ControllablePromise & CancellablePromise { const promise = createControllablePromise() - ;((promise as unknown) as CancellablePromise).cancel = () => { + ;(promise as unknown as CancellablePromise).cancel = () => { promise.reject(new PromiseCancelledError()) onCancel() } diff --git a/packages/core/src/utils/crypto/common.ts b/packages/core/src/utils/crypto/common.ts index 8e0f601c..4cff5838 100644 --- a/packages/core/src/utils/crypto/common.ts +++ b/packages/core/src/utils/crypto/common.ts @@ -1,5 +1,5 @@ -import { IEncryptionScheme } from './abstract' import { xorBufferInPlace } from '../buffer-utils' +import { IEncryptionScheme } from './abstract' export class AesModeOfOperationIge implements IEncryptionScheme { private _key: Buffer diff --git a/packages/core/src/utils/crypto/factorization.ts b/packages/core/src/utils/crypto/factorization.ts index d87cdb17..baea1beb 100644 --- a/packages/core/src/utils/crypto/factorization.ts +++ b/packages/core/src/utils/crypto/factorization.ts @@ -1,6 +1,11 @@ -import { bigIntToBuffer, bufferToBigInt, randomBigIntInRange } from '../bigint-utils' import bigInt, { BigInteger } from 'big-integer' +import { + bigIntToBuffer, + bufferToBigInt, + randomBigIntInRange, +} from '../bigint-utils' + export function factorizePQSync(pq: Buffer): [Buffer, Buffer] { const pq_ = bufferToBigInt(pq) @@ -16,10 +21,7 @@ export function factorizePQSync(pq: Buffer): [Buffer, Buffer] { q = n } - return [ - bigIntToBuffer(p), - bigIntToBuffer(q), - ] + return [bigIntToBuffer(p), bigIntToBuffer(q)] } function PollardRhoBrent(n: BigInteger): BigInteger { diff --git a/packages/core/src/utils/crypto/forge-crypto.ts b/packages/core/src/utils/crypto/forge-crypto.ts index 2e8bbd34..441b7543 100644 --- a/packages/core/src/utils/crypto/forge-crypto.ts +++ b/packages/core/src/utils/crypto/forge-crypto.ts @@ -1,5 +1,5 @@ -import { BaseCryptoProvider, IEncryptionScheme, IHashMethod } from './abstract' import { MaybeAsync } from '../../types' +import { BaseCryptoProvider, IEncryptionScheme, IHashMethod } from './abstract' let forge: any = null try { diff --git a/packages/core/src/utils/crypto/index.ts b/packages/core/src/utils/crypto/index.ts index 2037fe96..22aeffd7 100644 --- a/packages/core/src/utils/crypto/index.ts +++ b/packages/core/src/utils/crypto/index.ts @@ -9,4 +9,5 @@ export { NodeCryptoProvider, ForgeCryptoProvider } import { _defaultCryptoProviderFactory } from '../platform/crypto' import { CryptoProviderFactory } from './abstract' -export const defaultCryptoProviderFactory: CryptoProviderFactory = _defaultCryptoProviderFactory +export const defaultCryptoProviderFactory: CryptoProviderFactory = + _defaultCryptoProviderFactory diff --git a/packages/core/src/utils/crypto/keys.ts b/packages/core/src/utils/crypto/keys.ts index 9540d550..52f1d7b5 100644 --- a/packages/core/src/utils/crypto/keys.ts +++ b/packages/core/src/utils/crypto/keys.ts @@ -1,8 +1,9 @@ -import { parseAsn1, parsePemContents } from '../binary/asn1-parser' -import { TlBinaryWriter } from '@mtcute/tl-runtime/src/writer' -import { ICryptoProvider } from './abstract' -import keysIndex, { TlPublicKey } from '@mtcute/tl/binary/rsa-keys' import Long from 'long' +import { TlBinaryWriter } from '@mtcute/tl-runtime' +import keysIndex, { TlPublicKey } from '@mtcute/tl/binary/rsa-keys' + +import { parseAsn1, parsePemContents } from '../binary/asn1-parser' +import { ICryptoProvider } from './abstract' export async function parsePublicKey( crypto: ICryptoProvider, diff --git a/packages/core/src/utils/crypto/mtproto.ts b/packages/core/src/utils/crypto/mtproto.ts index 5a99d360..f6f2bd0d 100644 --- a/packages/core/src/utils/crypto/mtproto.ts +++ b/packages/core/src/utils/crypto/mtproto.ts @@ -55,7 +55,11 @@ export async function createAesIgeForMessageOld( Buffer.concat([messageKey, authKey.slice(x, 32 + x)]) ) const sha1b = await crypto.sha1( - Buffer.concat([authKey.slice(32 + x, 48 + x), messageKey, authKey.slice(48 + x, 64 + x)]) + Buffer.concat([ + authKey.slice(32 + x, 48 + x), + messageKey, + authKey.slice(48 + x, 64 + x), + ]) ) const sha1c = await crypto.sha1( Buffer.concat([authKey.slice(64 + x, 96 + x), messageKey]) diff --git a/packages/core/src/utils/crypto/node-crypto.ts b/packages/core/src/utils/crypto/node-crypto.ts index 3204f828..cf49122a 100644 --- a/packages/core/src/utils/crypto/node-crypto.ts +++ b/packages/core/src/utils/crypto/node-crypto.ts @@ -1,6 +1,13 @@ -import { BaseCryptoProvider, IEncryptionScheme, IHashMethod } from './abstract' +import { + createCipheriv, + createDecipheriv, + createHash, + createHmac, + pbkdf2, +} from 'crypto' + import { MaybeAsync } from '../../types' -import { createCipheriv, createDecipheriv, createHash, createHmac, pbkdf2 } from 'crypto' +import { BaseCryptoProvider, IEncryptionScheme, IHashMethod } from './abstract' export class NodeCryptoProvider extends BaseCryptoProvider { constructor() { @@ -8,9 +15,11 @@ export class NodeCryptoProvider extends BaseCryptoProvider { } createAesCtr(key: Buffer, iv: Buffer, encrypt: boolean): IEncryptionScheme { - const cipher = ( - encrypt ? createCipheriv : createDecipheriv - )(`aes-${key.length * 8}-ctr`, key, iv) + const cipher = (encrypt ? createCipheriv : createDecipheriv)( + `aes-${key.length * 8}-ctr`, + key, + iv + ) const update = (data: Buffer) => cipher.update(data) @@ -30,11 +39,7 @@ export class NodeCryptoProvider extends BaseCryptoProvider { return Buffer.concat([cipher.update(data), cipher.final()]) }, decrypt(data: Buffer) { - const cipher = createDecipheriv( - methodName, - key, - null - ) + const cipher = createDecipheriv(methodName, key, null) cipher.setAutoPadding(false) return Buffer.concat([cipher.update(data), cipher.final()]) }, @@ -46,7 +51,7 @@ export class NodeCryptoProvider extends BaseCryptoProvider { salt: Buffer, iterations: number, keylen = 64, - algo = 'sha512', + algo = 'sha512' ): MaybeAsync { return new Promise((resolve, reject) => pbkdf2( diff --git a/packages/core/src/utils/crypto/password.ts b/packages/core/src/utils/crypto/password.ts index 79b4ca36..2e1e4ea3 100644 --- a/packages/core/src/utils/crypto/password.ts +++ b/packages/core/src/utils/crypto/password.ts @@ -1,8 +1,9 @@ -import { tl } from '@mtcute/tl' -import { ICryptoProvider } from './abstract' -import { bigIntToBuffer, bufferToBigInt } from '../bigint-utils' import bigInt from 'big-integer' +import { tl } from '@mtcute/tl' + import { randomBytes, xorBuffer } from '../buffer-utils' +import { bigIntToBuffer, bufferToBigInt } from '../bigint-utils' +import { ICryptoProvider } from './abstract' export async function computePasswordHash( crypto: ICryptoProvider, diff --git a/packages/core/src/utils/deque.ts b/packages/core/src/utils/deque.ts index c471c924..37b7024a 100644 --- a/packages/core/src/utils/deque.ts +++ b/packages/core/src/utils/deque.ts @@ -95,9 +95,8 @@ export class Deque { pushFront(item: T): void { if (item === undefined) throw new Error('item can not be undefined') - this._elements[ - (this._head = (this._head - 1) & (this._capacity - 1)) - ] = item + this._elements[(this._head = (this._head - 1) & (this._capacity - 1))] = + item if (this._head === this._tail) { this._resize() diff --git a/packages/core/src/utils/early-timer.ts b/packages/core/src/utils/early-timer.ts index 8102fbb4..069dbc7e 100644 --- a/packages/core/src/utils/early-timer.ts +++ b/packages/core/src/utils/early-timer.ts @@ -9,7 +9,7 @@ export class EarlyTimer { private _handler: () => void = () => {} - constructor () { + constructor() { this.emitNow = this.emitNow.bind(this) } diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index e318af9c..7dcd11ce 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -1,13 +1,21 @@ export * from './crypto' -export * from './logger' -export * from './peer-utils' -export * from './tl-json' + export * from './async-lock' -export * from './lru-map' -export * from './function-utils' -export * from './buffer-utils' export * from './bigint-utils' -export * from './misc-utils' -export * from './long-utils' -export * from './linked-list' +export * from './buffer-utils' +export * from './condition-variable' +export * from './controllable-promise' +export * from './default-dcs' export * from './deque' +export * from './early-timer' +export * from './flood-control' +export * from './function-utils' +export * from './linked-list' +export * from './logger' +export * from './long-utils' +export * from './lru-map' +export * from './lru-string-set' +export * from './misc-utils' +export * from './peer-utils' +export * from './sorted-array' +export * from './tl-json' diff --git a/packages/core/src/utils/linked-list.ts b/packages/core/src/utils/linked-list.ts index a7928e01..322ceb79 100644 --- a/packages/core/src/utils/linked-list.ts +++ b/packages/core/src/utils/linked-list.ts @@ -9,8 +9,7 @@ export class SortedLinkedList { _last?: LinkedListItem _size = 0 - constructor(private comparator: (a: T, b: T) => number) { - } + constructor(private comparator: (a: T, b: T) => number) {} get length(): number { return this._size diff --git a/packages/core/src/utils/logger.ts b/packages/core/src/utils/logger.ts index b8f6e133..945e3660 100644 --- a/packages/core/src/utils/logger.ts +++ b/packages/core/src/utils/logger.ts @@ -23,7 +23,11 @@ export class Logger { prefix = '' - constructor(readonly mgr: LogManager, readonly tag: string, readonly parent: Logger = mgr) { + constructor( + readonly mgr: LogManager, + readonly tag: string, + readonly parent: Logger = mgr + ) { let hash = 0 for (let i = 0; i < tag.length; i++) { @@ -75,7 +79,13 @@ export class Logger { }) } - this.mgr.handler(this.color, level, this.tag, this.getPrefix() + fmt, args) + this.mgr.handler( + this.color, + level, + this.tag, + this.getPrefix() + fmt, + args + ) } readonly error = this.log.bind(this, LogManager.ERROR) @@ -109,7 +119,7 @@ export class LogManager extends Logger { static DEBUG = 4 static VERBOSE = 5 - constructor () { + constructor() { // workaround because we cant pass this to super super(null as any, 'base') ;(this as any).mgr = this diff --git a/packages/core/src/utils/long-utils.ts b/packages/core/src/utils/long-utils.ts index 2ba6fb90..44346bd3 100644 --- a/packages/core/src/utils/long-utils.ts +++ b/packages/core/src/utils/long-utils.ts @@ -59,7 +59,6 @@ export function longFromFastString(val: string, unsigned = false): Long { return new Long(low, high, unsigned) } - /** * Map with Longs as key. * @@ -159,7 +158,7 @@ export class LongMap { } private *_valuesForObj(): IterableIterator { - yield * (Object.values(this._obj!) as any) + yield* Object.values(this._obj!) as any } private _clearForObj(): void { diff --git a/packages/core/src/utils/peer-utils.ts b/packages/core/src/utils/peer-utils.ts index 9c8c2735..44c50145 100644 --- a/packages/core/src/utils/peer-utils.ts +++ b/packages/core/src/utils/peer-utils.ts @@ -45,10 +45,7 @@ export function getBarePeerId(peer: tl.TypePeer): number { * - ID is negated for chats * - ID is negated and `-1e12` is subtracted for channels */ -export function getMarkedPeerId( - peerId: number, - peerType: BasicPeerType -): number +export function getMarkedPeerId(peerId: number, peerType: BasicPeerType): number export function getMarkedPeerId(peer: tl.TypePeer | tl.TypeInputPeer): number export function getMarkedPeerId( peer: tl.TypePeer | tl.TypeInputPeer | number, @@ -101,16 +98,10 @@ export function getBasicPeerType(peer: tl.TypePeer | number): BasicPeerType { return 'chat' } - if ( - MIN_MARKED_CHANNEL_ID <= peer && - peer !== ZERO_CHANNEL_ID - ) + if (MIN_MARKED_CHANNEL_ID <= peer && peer !== ZERO_CHANNEL_ID) return 'channel' - if ( - MAX_SECRET_CHAT_ID <= peer && - peer !== ZERO_SECRET_CHAT_ID - ) { + if (MAX_SECRET_CHAT_ID <= peer && peer !== ZERO_SECRET_CHAT_ID) { // return 'secret' throw new Error('Unsupported') } diff --git a/packages/core/src/utils/platform/crypto.ts b/packages/core/src/utils/platform/crypto.ts index 5e527d61..8bd23100 100644 --- a/packages/core/src/utils/platform/crypto.ts +++ b/packages/core/src/utils/platform/crypto.ts @@ -1,6 +1,7 @@ -import { NodeCryptoProvider } from '../crypto' import { randomBytes } from 'crypto' +import { NodeCryptoProvider } from '../crypto' + /** @internal */ export const _defaultCryptoProviderFactory = () => new NodeCryptoProvider() diff --git a/packages/core/src/utils/platform/logging.web.ts b/packages/core/src/utils/platform/logging.web.ts index 8d932fa8..cae1d9e8 100644 --- a/packages/core/src/utils/platform/logging.web.ts +++ b/packages/core/src/utils/platform/logging.web.ts @@ -5,7 +5,7 @@ const LEVEL_NAMES = [ 'WRN', 'INF', 'DBG', - 'VRB' + 'VRB', ] const COLORS = [ '', // OFF diff --git a/packages/core/src/utils/platform/transport.web.ts b/packages/core/src/utils/platform/transport.web.ts index 7b12f8ef..89e184e4 100644 --- a/packages/core/src/utils/platform/transport.web.ts +++ b/packages/core/src/utils/platform/transport.web.ts @@ -3,9 +3,9 @@ import { WebSocketTransport } from '../../network' /** @internal */ export const _defaultTransportFactory = typeof WebSocket === 'undefined' - // if no websocket, throw an error i guess ¯\_(ツ)_/¯ - // (user can still implement something on their own) - ? () => { + ? // if no websocket, throw an error i guess ¯\_(ツ)_/¯ + // (user can still implement something on their own) + () => { throw new Error( 'Neither TCP nor WebSocket are available. Please pass a Transport factory explicitly' ) diff --git a/packages/core/tests/bigint-utils.spec.ts b/packages/core/tests/bigint-utils.spec.ts index 5746989b..dec0ad98 100644 --- a/packages/core/tests/bigint-utils.spec.ts +++ b/packages/core/tests/bigint-utils.spec.ts @@ -1,37 +1,23 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { bigIntToBuffer, bufferToBigInt } from '../src/utils/bigint-utils' import bigInt from 'big-integer' +import { bigIntToBuffer, bufferToBigInt } from '../src' + // since bigIntToBuffer is a tiny wrapper over writeBigInt, no need to test it individually describe('bigIntToBuffer', () => { it('should handle writing to BE', () => { expect([...bigIntToBuffer(bigInt('10495708'), 0, false)]).eql([ - 0xa0, - 0x26, - 0xdc, + 0xa0, 0x26, 0xdc, ]) expect([...bigIntToBuffer(bigInt('10495708'), 4, false)]).eql([ - 0x00, - 0xa0, - 0x26, - 0xdc, + 0x00, 0xa0, 0x26, 0xdc, ]) expect([...bigIntToBuffer(bigInt('10495708'), 8, false)]).eql([ - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xa0, - 0x26, - 0xdc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x26, 0xdc, ]) expect([...bigIntToBuffer(bigInt('3038102549'), 4, false)]).eql([ - 0xb5, - 0x15, - 0xc4, - 0x15, + 0xb5, 0x15, 0xc4, 0x15, ]) expect([ ...bigIntToBuffer(bigInt('9341376580368336208'), 8, false), @@ -39,35 +25,20 @@ describe('bigIntToBuffer', () => { }) it('should handle writing to LE', () => { expect([...bigIntToBuffer(bigInt('10495708'), 0, true)]).eql([ - 0xdc, - 0x26, - 0xa0, + 0xdc, 0x26, 0xa0, ]) expect([...bigIntToBuffer(bigInt('10495708'), 4, true)]).eql([ - 0xdc, - 0x26, - 0xa0, - 0x00, + 0xdc, 0x26, 0xa0, 0x00, ]) expect([...bigIntToBuffer(bigInt('10495708'), 8, true)]).eql([ - 0xdc, - 0x26, - 0xa0, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, + 0xdc, 0x26, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, ]) expect([...bigIntToBuffer(bigInt('3038102549'), 4, true)]).eql([ - 0x15, - 0xc4, - 0x15, - 0xb5, + 0x15, 0xc4, 0x15, 0xb5, ]) - expect([ - ...bigIntToBuffer(bigInt('9341376580368336208'), 8, true), - ]).eql([...Buffer.from('81A33C81D2020550', 'hex').reverse()]) + expect([...bigIntToBuffer(bigInt('9341376580368336208'), 8, true)]).eql( + [...Buffer.from('81A33C81D2020550', 'hex').reverse()] + ) }) }) diff --git a/packages/core/tests/buffer-utils.spec.ts b/packages/core/tests/buffer-utils.spec.ts index c897d5f0..64c215bb 100644 --- a/packages/core/tests/buffer-utils.spec.ts +++ b/packages/core/tests/buffer-utils.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { buffersEqual, cloneBuffer, diff --git a/packages/core/tests/crypto-providers.spec.ts b/packages/core/tests/crypto-providers.spec.ts index 999b065e..0da9d92a 100644 --- a/packages/core/tests/crypto-providers.spec.ts +++ b/packages/core/tests/crypto-providers.spec.ts @@ -1,8 +1,11 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { NodeCryptoProvider } from '../src/utils/crypto/node-crypto' -import { ForgeCryptoProvider } from '../src/utils/crypto/forge-crypto' -import { ICryptoProvider } from '../src/utils/crypto/abstract' + +import { + ICryptoProvider, + ForgeCryptoProvider, + NodeCryptoProvider, +} from '../src' export function testCryptoProvider(c: ICryptoProvider): void { it('should calculate sha1', async () => { diff --git a/packages/core/tests/e2e/_setup-accounts.spec.ts b/packages/core/tests/e2e/_setup-accounts.spec.ts deleted file mode 100644 index faeda9f2..00000000 --- a/packages/core/tests/e2e/_setup-accounts.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { before } from 'mocha' -import { createTestTelegramClient } from './utils' - -require('dotenv-flow').config() - -async function getTestAccount(dcId = 2) { - console.log('Preparing e2e account for dc %d...', dcId) - - const tg = createTestTelegramClient() - - await tg.connect() - - let numbers = Math.floor(Math.random() * 9999).toString() - while (numbers.length !== 4) numbers += '0' - - const phone = `99966${dcId}${numbers}` - const code = `${dcId}${dcId}${dcId}${dcId}${dcId}${dcId}` - - const res = await tg.call({ - _: 'auth.sendCode', - phoneNumber: phone, - apiId: tg['_initConnectionParams'].apiId, - apiHash: tg['_apiHash'], - settings: { _: 'codeSettings' }, - }) - - const res1 = await tg.call({ - _: 'auth.signIn', - phoneNumber: phone, - phoneCodeHash: res.phoneCodeHash, - phoneCode: code, - }) - - if (res1._ === 'auth.authorizationSignUpRequired') { - await tg.call({ - _: 'auth.signUp', - phoneNumber: phone, - phoneCodeHash: res.phoneCodeHash, - firstName: 'MTCute E2E', - lastName: '', - }) - } - - const username = `mtcute_e2e_${numbers}` - - await tg.call({ - _: 'account.updateUsername', - username, - }) - - const ret = [username, await tg.exportSession()] - - await tg.close() - - return ret -} - -before(async function () { - this.timeout(60000) - - const [username1, session1] = await getTestAccount(1) - const [username2, session2] = await getTestAccount(2) - - process.env.USER_USERNAME = username2 - process.env.USER_SESSION = session2 - - process.env.USER_OTHER_DC_USERNAME = username1 - process.env.USER_OTHER_DC_SESSION = session1 -}) diff --git a/packages/core/tests/e2e/idle-connection.spec.ts b/packages/core/tests/e2e/idle-connection.spec.ts deleted file mode 100644 index 81c4653a..00000000 --- a/packages/core/tests/e2e/idle-connection.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { describe, it } from 'mocha' -import { expect } from 'chai' -import { TransportState } from '../../src' -import { sleep } from '../../src/utils/misc-utils' -import { createTestTelegramClient } from './utils' - -require('dotenv-flow').config() - -describe('e2e : idle connection', function () { - - this.timeout(120000) - - // 75s is to make sure ping is sent - - it('75s idle to test dc', async () => { - const client = createTestTelegramClient() - - await client.connect() - await sleep(75000) - - expect(client.primaryConnection['_transport'].state()).eq(TransportState.Ready) - - const config = await client.call({ _: 'help.getConfig' }) - expect(config._).eql('config') - - await client.close() - expect(client.primaryConnection['_transport'].state()).eq(TransportState.Idle) - }) - - if (!process.env.USER_SESSION) { - console.warn('Warning: skipping e2e idle connection test with auth (no USER_SESSION)') - return - } - - it('75s idle to test dc with auth', async () => { - const client = createTestTelegramClient() - - client.importSession(process.env.USER_SESSION!) - - await client.connect() - await sleep(75000) - - expect(client.primaryConnection['_transport'].state()).eq(TransportState.Ready) - - const config = await client.call({ _: 'help.getConfig' }) - expect(config._).eql('config') - - await client.close() - expect(client.primaryConnection['_transport'].state()).eq(TransportState.Idle) - }) -}) diff --git a/packages/core/tests/e2e/receiving-updates.spec.ts b/packages/core/tests/e2e/receiving-updates.spec.ts deleted file mode 100644 index bf92fba7..00000000 --- a/packages/core/tests/e2e/receiving-updates.spec.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { describe, it } from 'mocha' -import { expect } from 'chai' -import { BaseTelegramClient, bufferToBigInt, defaultDcs, randomBytes, tl } from '../../src' -import { sleep } from '../../src/utils/misc-utils' -import { createTestTelegramClient } from './utils' - -require('dotenv-flow').config() - -async function createClientPair( - session1: string, - session2: string -): Promise<[BaseTelegramClient, BaseTelegramClient]> { - const client1 = createTestTelegramClient() - - if (session1.indexOf(':') > -1) { - // bot token - await client1.call({ - _: 'auth.importBotAuthorization', - apiId: parseInt(process.env.API_ID!), - apiHash: process.env.API_HASH!, - botAuthToken: session1, - flags: 0 - }) - } else { - client1.importSession(session1) - } - - const client2 = createTestTelegramClient() - - if (session2.indexOf(':') > -1) { - // bot token - await client2.call({ - _: 'auth.importBotAuthorization', - apiId: parseInt(process.env.API_ID!), - apiHash: process.env.API_HASH!, - botAuthToken: session2, - flags: 0 - }) - } else { - client2.importSession(session2) - } - - return [client1, client2] -} - -describe('e2e : receiving updates', function () { - if (!process.env.BOT_TOKEN || !process.env.USER_SESSION) { - console.warn('Warning: skipping e2e updates test (no API_ID or API_HASH)') - return - } - - this.timeout(60000) - - it('receiving from user by bot', async () => { - const [actor, observer] = await createClientPair( - process.env.USER_SESSION!, - process.env.BOT_TOKEN! - ) - - await observer.connect() - await observer.waitUntilUsable() - - let updatesCount = 0 - - observer['_handleUpdate'] = function() { - updatesCount += 1 - } - - const bot = await actor.call({ - _: 'contacts.resolveUsername', - username: process.env.BOT_USERNAME! - }).then((res) => res.users[0]) - - expect(bot._).eq('user') - - const inputPeer: tl.TypeInputPeer = { - _: 'inputPeerUser', - userId: bot.id, - accessHash: (bot as tl.RawUser).accessHash! - } - - await actor.call({ - _: 'messages.startBot', - bot: { - _: 'inputUser', - userId: bot.id, - accessHash: (bot as tl.RawUser).accessHash! - }, - peer: inputPeer, - randomId: bufferToBigInt(randomBytes(8)), - startParam: '123' - }) - - for (let i = 0; i < 5; i++) { - await actor.call({ - _: 'messages.sendMessage', - peer: inputPeer, - randomId: bufferToBigInt(randomBytes(8)), - message: `Test ${i}` - }) - await sleep(1000) - } - - // to make sure the updates were delivered - await sleep(5000) - - // 5 messages + /start = 6 - // it is assumed that there were no gaps - expect(updatesCount).gte(6) - - await actor.close() - await observer.close() - }) - - it('receiving from user by user', async () => { - const [actor, observer] = await createClientPair( - process.env.USER_SESSION!, - process.env.USER_OTHER_DC_SESSION! - ) - - await observer.connect() - await observer.waitUntilUsable() - - let updatesCount = 0 - - observer['_handleUpdate'] = function() { - updatesCount += 1 - } - - const user = await actor.call({ - _: 'contacts.resolveUsername', - username: process.env.USER_OTHER_DC_USERNAME! - }).then((res) => res.users[0]) - - expect(user._).eq('user') - - const inputPeer: tl.TypeInputPeer = { - _: 'inputPeerUser', - userId: user.id, - accessHash: (user as tl.RawUser).accessHash! - } - for (let i = 0; i < 5; i++) { - await sleep(1000) - await actor.call({ - _: 'messages.sendMessage', - peer: inputPeer, - randomId: bufferToBigInt(randomBytes(8)), - message: `Test ${i}` - }) - } - - // to make sure the updates were delivered - await sleep(5000) - - // 5 messages - // it is assumed that there were no gaps - expect(updatesCount).gte(5) - - await actor.close() - await observer.close() - }) -}) diff --git a/packages/core/tests/fuzz/fuzz-packet.spec.ts b/packages/core/tests/fuzz/fuzz-packet.spec.ts index 2d3f1549..c0a05861 100644 --- a/packages/core/tests/fuzz/fuzz-packet.spec.ts +++ b/packages/core/tests/fuzz/fuzz-packet.spec.ts @@ -1,13 +1,9 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { - BinaryReader, - BinaryWriter, - randomBytes, -} from '../../src' -import { sleep } from '../../src/utils/misc-utils' -import { createAesIgeForMessage } from '../../src/utils/crypto/mtproto' -import { createTestTelegramClient } from '../e2e/utils' +import { randomBytes } from 'crypto' +import { TlBinaryReader } from '@mtcute/tl-runtime' +import __tlReaderMap from '@mtcute/tl/binary/reader' +import { createTestTelegramClient } from './utils' require('dotenv-flow').config() @@ -20,71 +16,49 @@ describe('fuzz : packet', async function () { await client.connect() await client.waitUntilUsable() - const errors: Error[] = [] - - const errorHandler = (err: Error) => { - errors.push(err) - } - - client.onError(errorHandler) + let errors = 0 const conn = client.primaryConnection - const mtproto = conn['_mtproto'] - - const createFakeMtprotoPacket = async (payload: Buffer): Promise => { - // create a fake mtproto packet - const messageId = conn['_getMessageId']().minus(1) // must be odd - - const innerWriter = BinaryWriter.alloc(payload.length + 32) - innerWriter.raw(mtproto.serverSalt) - innerWriter.raw(mtproto._sessionId) - innerWriter.long(messageId) - innerWriter.int32(0) // seqno - innerWriter.int32(payload.length) - innerWriter.raw(payload) - - const innerData = innerWriter.result() - - const messageKey = ( - await mtproto._crypto.sha256( - Buffer.concat([mtproto._authKeyServerSalt!, innerData]) - ) - ).slice(8, 24) - const ige = await createAesIgeForMessage( - mtproto._crypto, - mtproto._authKey!, - messageKey, - false - ) - const encryptedData = await ige.encrypt(innerData) - - const writer = BinaryWriter.alloc(24 + encryptedData.length) - writer.raw(mtproto._authKeyId!) - writer.raw(messageKey) - - return Buffer.concat([mtproto._authKeyId!, messageKey, encryptedData]) - } + const mtproto = conn['_session'] for (let i = 0; i < 100; i++) { const payload = randomBytes(Math.round(Math.random() * 16) * 16) - await conn['onMessage'](await createFakeMtprotoPacket(payload)) - await sleep(100) + try { + conn['_handleRawMessage']( + mtproto.getMessageId().sub(1), + 0, + new TlBinaryReader(__tlReaderMap, payload) + ) + } catch (e) { + errors += 1 + } } // similar test, but this time only using object ids that do exist - const objectIds = Object.keys(new BinaryReader(Buffer.alloc(0))._objectsMap) + const objectIds = Object.keys(__tlReaderMap) for (let i = 0; i < 100; i++) { - const payload = randomBytes((Math.round(Math.random() * 16) + 1) * 16) - const objectId = parseInt(objectIds[Math.round(Math.random() * objectIds.length)]) + const payload = randomBytes( + (Math.round(Math.random() * 16) + 1) * 16 + ) + const objectId = parseInt( + objectIds[Math.round(Math.random() * objectIds.length)] + ) payload.writeUInt32LE(objectId, 0) - await conn['onMessage'](await createFakeMtprotoPacket(payload)) - await sleep(100) + try { + conn['_handleRawMessage']( + mtproto.getMessageId().sub(1), + 0, + new TlBinaryReader(__tlReaderMap, payload) + ) + } catch (e) { + errors += 1 + } } await client.close() - expect(errors.length).gt(0) + expect(errors).gt(0) }) }) diff --git a/packages/core/tests/fuzz/fuzz-session.spec.ts b/packages/core/tests/fuzz/fuzz-session.spec.ts index 7cfa9ca0..d4130b19 100644 --- a/packages/core/tests/fuzz/fuzz-session.spec.ts +++ b/packages/core/tests/fuzz/fuzz-session.spec.ts @@ -1,9 +1,11 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { randomBytes, sleep } from '../../src' -import { createTestTelegramClient } from '../e2e/utils' +import { randomBytes } from 'crypto' import { tl } from '@mtcute/tl' +import { sleep } from '../../src' +import { createTestTelegramClient } from './utils' + require('dotenv-flow').config() describe('fuzz : session', async function () { @@ -18,7 +20,6 @@ describe('fuzz : session', async function () { // client is supposed to handle this and generate a new key - const errors: Error[] = [] const errorHandler = (err: Error) => { @@ -73,60 +74,4 @@ describe('fuzz : session', async function () { initKey.toString('hex') ) }) - - if (!process.env.USER_SESSION) { - console.warn('Warning: skipping fuzz session test with auth (no USER_SESSION)') - return - } - - it('random auth_key for other dc with auth', async () => { - const client = createTestTelegramClient() - - client.importSession(process.env.USER_SESSION!) - - // random key for dc1 - const initKey = randomBytes(256) - await client.storage.setAuthKeyFor(1, initKey) - - // client is supposed to handle this and generate a new key, - // and then export auth there - - const errors: Error[] = [] - - const errorHandler = (err: Error) => { - errors.push(err) - } - - client.onError(errorHandler) - - await client.connect() - await client.waitUntilUsable() - - const conn = await client.createAdditionalConnection(1) - - let hadError = false - try { - await client.call({ - _: 'users.getUsers', - id: [ - { - _: 'inputUserSelf' - } - ] - }, { connection: conn }) - } catch (e) { - if (e instanceof tl.errors.UserMigrateXError) { - hadError = true - } - } - - await client.close() - - expect(errors.length).eq(0) - - expect((await client.storage.getAuthKeyFor(1))!.toString('hex')).not.eq( - initKey.toString('hex') - ) - expect(hadError).true - }) }) diff --git a/packages/core/tests/fuzz/fuzz-transport.spec.ts b/packages/core/tests/fuzz/fuzz-transport.spec.ts index 9b11fbe4..e1f12b19 100644 --- a/packages/core/tests/fuzz/fuzz-transport.spec.ts +++ b/packages/core/tests/fuzz/fuzz-transport.spec.ts @@ -1,22 +1,23 @@ import { describe, it } from 'mocha' import { expect } from 'chai' +import { EventEmitter } from 'events' +import { randomBytes } from 'crypto' + import { BaseTelegramClient, defaultDcs, - ITelegramTransport, NodeCryptoProvider, - randomBytes, + ITelegramTransport, tl, TransportState, + NodeCryptoProvider, + sleep, } from '../../src' -import { EventEmitter } from 'events' -import { sleep } from '../../src/utils/misc-utils' require('dotenv-flow').config() class RandomBytesTransport extends EventEmitter implements ITelegramTransport { - dc: tl.RawDcOption - - interval: NodeJS.Timeout | null + dc!: tl.RawDcOption + interval!: NodeJS.Timeout | null close(): void { clearInterval(this.interval!) @@ -58,6 +59,7 @@ describe('fuzz : transport', function () { apiHash: '', primaryDc: defaultDcs.defaultTestDc, }) + client.log.level = 0 const errors: Error[] = [] @@ -83,6 +85,8 @@ describe('fuzz : transport', function () { apiHash: '', primaryDc: defaultDcs.defaultTestDc, }) + client.log.level = 0 + // random key just to make it think it already has one await client.storage.setAuthKeyFor(2, randomBytes(256)) @@ -97,15 +101,20 @@ describe('fuzz : transport', function () { let hadNonNull = false const decryptMessage = - client.primaryConnection['_mtproto'].decryptMessage - client.primaryConnection[ - '_mtproto' - ].decryptMessage = async function () { - const res = await decryptMessage.apply(this, arguments) - if (res !== null) hadNonNull = true + client.primaryConnection['_session'].decryptMessage - return res - } + // ехал any через any + // видит any - any, any + // сунул any any в any + // any any any any + ;(client.primaryConnection['_session'] as any).decryptMessage = ( + buf: any, + cb: any + ) => + decryptMessage.call(this, buf, (...args: any[]) => { + cb(...(args as any)) + hadNonNull = true + }) await sleep(15000) await client.close() diff --git a/packages/core/tests/e2e/utils.ts b/packages/core/tests/fuzz/utils.ts similarity index 79% rename from packages/core/tests/e2e/utils.ts rename to packages/core/tests/fuzz/utils.ts index f4697c69..8d63d7e2 100644 --- a/packages/core/tests/e2e/utils.ts +++ b/packages/core/tests/fuzz/utils.ts @@ -1,15 +1,15 @@ import { BaseTelegramClient, NodeCryptoProvider, TcpTransport } from '../../src' -// require('debug').enable('mtcute:*') - export function createTestTelegramClient() { - return new BaseTelegramClient({ + const tg = new BaseTelegramClient({ // provided explicitly because mocha crypto: () => new NodeCryptoProvider(), transport: () => new TcpTransport(), // example values from tdlib apiId: 94575, apiHash: 'a3406de8d171bb422bb6ddf3bbd800e2', - testMode: true + testMode: true, }) + tg.log.level = 0 + return tg } diff --git a/packages/core/tests/keys.spec.ts b/packages/core/tests/keys.spec.ts index 85012712..6af47c81 100644 --- a/packages/core/tests/keys.spec.ts +++ b/packages/core/tests/keys.spec.ts @@ -1,7 +1,8 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { parsePublicKey } from '../src/utils/crypto/keys' -import { NodeCryptoProvider } from '../src/utils/crypto/node-crypto' +import { NodeCryptoProvider } from '../src' const crypto = new NodeCryptoProvider() diff --git a/packages/core/tests/lru-map.spec.ts b/packages/core/tests/lru-map.spec.ts index 88022c93..93514b11 100644 --- a/packages/core/tests/lru-map.spec.ts +++ b/packages/core/tests/lru-map.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { LruMap } from '../src' describe('LruMap', () => { diff --git a/packages/core/tests/lru-string-set.spec.ts b/packages/core/tests/lru-string-set.spec.ts index 31e2e1e8..be65dab8 100644 --- a/packages/core/tests/lru-string-set.spec.ts +++ b/packages/core/tests/lru-string-set.spec.ts @@ -1,10 +1,11 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { LruStringSet } from '../src/utils/lru-string-set' + +import { LruSet } from '../src' describe('LruStringSet', () => { it('Set backend', () => { - const set = new LruStringSet(2) + const set = new LruSet(2) set.add('first') expect(set.has('first')).true @@ -31,7 +32,7 @@ describe('LruStringSet', () => { }) it('Object backend', () => { - const set = new LruStringSet(2, true) + const set = new LruSet(2, true) set.add('first') expect(set.has('first')).true diff --git a/packages/core/tests/prime-factorization.spec.ts b/packages/core/tests/prime-factorization.spec.ts index c6cc57bb..0cc1d301 100644 --- a/packages/core/tests/prime-factorization.spec.ts +++ b/packages/core/tests/prime-factorization.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { factorizePQSync } from '../src/utils/crypto/factorization' describe('prime factorization', function () { diff --git a/packages/core/tests/transport-codecs/intermediate-codec.spec.ts b/packages/core/tests/transport-codecs/intermediate-codec.spec.ts index 968672ba..a0e265ee 100644 --- a/packages/core/tests/transport-codecs/intermediate-codec.spec.ts +++ b/packages/core/tests/transport-codecs/intermediate-codec.spec.ts @@ -1,7 +1,7 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { IntermediatePacketCodec } from '../../src/network/transports/intermediate' -import { TransportError } from '../../src/network/transports/abstract' + +import { IntermediatePacketCodec, TransportError } from '../../src' describe('IntermediatePacketCodec', () => { it('should return correct tag', () => { diff --git a/packages/crypto-node/package.json b/packages/crypto-node/package.json index 2cd15263..411ed795 100644 --- a/packages/crypto-node/package.json +++ b/packages/crypto-node/package.json @@ -14,7 +14,7 @@ "rebuild:dev": "node-gyp configure --debug && node-gyp -j 16 rebuild --debug", "rebuild": "node-gyp configure && node-gyp -j 16 rebuild", "clean": "node-gyp clean", - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "docs": "npx typedoc" }, "dependencies": { diff --git a/packages/crypto-node/src/index.ts b/packages/crypto-node/src/index.ts index dbb5f0a2..d5d0c162 100644 --- a/packages/crypto-node/src/index.ts +++ b/packages/crypto-node/src/index.ts @@ -1,4 +1,5 @@ import { NodeCryptoProvider, IEncryptionScheme } from '@mtcute/core' + import { ige256_decrypt, ige256_encrypt } from './native' /** diff --git a/packages/dispatcher/package.json b/packages/dispatcher/package.json index 94017066..dba44820 100644 --- a/packages/dispatcher/package.json +++ b/packages/dispatcher/package.json @@ -7,7 +7,7 @@ "license": "LGPL-3.0", "main": "src/index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/dispatcher/src/callback-data-builder.ts b/packages/dispatcher/src/callback-data-builder.ts index e92e68cd..6611120e 100644 --- a/packages/dispatcher/src/callback-data-builder.ts +++ b/packages/dispatcher/src/callback-data-builder.ts @@ -1,5 +1,6 @@ import { MaybeArray } from '@mtcute/core' import { CallbackQuery, MtArgumentError } from '@mtcute/client' + import { UpdateFilter } from './filters' /** @@ -45,9 +46,7 @@ export class CallbackDataBuilder { .join(this.sep) if (ret.length > 64) { - throw new MtArgumentError( - 'Resulting callback data is too long.' - ) + throw new MtArgumentError('Resulting callback data is too long.') } return ret @@ -109,6 +108,7 @@ export class CallbackDataBuilder { .join('|')})` ) } else { + // noinspection SuspiciousTypeOfGuard parts.push( typeof value === 'string' ? value : (value as RegExp).source ) @@ -122,13 +122,12 @@ export class CallbackDataBuilder { return (query) => { const m = query.dataStr?.match(regex) if (!m) return false - ;(query as CallbackQuery & { - match: Record - }).match = this.parse(m[0]) + ;( + query as CallbackQuery & { + match: Record + } + ).match = this.parse(m[0]) return true } } } - -const a = new CallbackDataBuilder('post', 'foo', 'bar') - diff --git a/packages/dispatcher/src/dispatcher.ts b/packages/dispatcher/src/dispatcher.ts index 17521a4d..5a36213f 100644 --- a/packages/dispatcher/src/dispatcher.ts +++ b/packages/dispatcher/src/dispatcher.ts @@ -21,6 +21,7 @@ import { ChatJoinRequestUpdate, } from '@mtcute/client' import { tl } from '@mtcute/tl' + // begin-codegen-imports import { UpdateHandler, @@ -42,12 +43,15 @@ import { ChatJoinRequestHandler, } from './handler' // end-codegen-imports -import { filters, UpdateFilter } from './filters' -import { IStateStorage, UpdateState, StateKeyDelegate } from './state' -import { defaultStateKeyDelegate } from './state' -import { PropagationAction } from './propagation' -const noop = () => {} +import { filters, UpdateFilter } from './filters' +import { + IStateStorage, + UpdateState, + StateKeyDelegate, + defaultStateKeyDelegate, +} from './state' +import { PropagationAction } from './propagation' /** * Updates dispatcher @@ -183,8 +187,7 @@ export class Dispatcher { * with error handler set to client's one. * * @param update Update to process - * @param users Users map - * @param chats Chats map + * @param peers Peers index */ dispatchRawUpdate( update: tl.TypeUpdate | tl.TypeMessage, diff --git a/packages/dispatcher/src/filters.ts b/packages/dispatcher/src/filters.ts index 3a4de8a0..4534f917 100644 --- a/packages/dispatcher/src/filters.ts +++ b/packages/dispatcher/src/filters.ts @@ -29,8 +29,9 @@ import { PollVoteUpdate, UserTypingUpdate, BotChatJoinRequestUpdate, -} from "@mtcute/client"; +} from '@mtcute/client' import { MaybeArray } from '@mtcute/core' + import { UpdateState } from './state' function extractText( @@ -153,8 +154,10 @@ export namespace filters { [K in TupleKeys]: { base: ExtractBase } } type Values = T[keyof T] - type UnwrapBase = T extends { base: any } ? T["base"] : never - type ExtractBaseMany = UnwrapBase>>> + type UnwrapBase = T extends { base: any } ? T['base'] : never + type ExtractBaseMany = UnwrapBase< + UnionToIntersection>> + > /** * Invert a filter by applying a NOT logical operation: @@ -374,15 +377,20 @@ export namespace filters { /** * Filter messages by chat type */ - export const chat = ( - type: T - ): UpdateFilter< - Message, - { - chat: Modify - sender: T extends 'private' | 'bot' | 'group' ? User : User | Chat - } - > => (msg) => msg.chat.type === type + export const chat = + ( + type: T + ): UpdateFilter< + Message, + { + chat: Modify + sender: T extends 'private' | 'bot' | 'group' + ? User + : User | Chat + } + > => + (msg) => + msg.chat.type === type /** * Filter updates by chat ID(s) or username(s) @@ -696,20 +704,26 @@ export namespace filters { /** * Filter messages containing a regular sticker (not animated/webm) */ - export const regularSticker: UpdateFilter = (msg) => - msg.media?.type === 'sticker' && !msg.media.isAnimated && !msg.media.isVideoSticker + export const regularSticker: UpdateFilter = ( + msg + ) => + msg.media?.type === 'sticker' && + !msg.media.isAnimated && + !msg.media.isVideoSticker /** * Filter messages containing an animated sticker */ - export const animatedSticker: UpdateFilter = (msg) => - msg.media?.type === 'sticker' && msg.media.isAnimated + export const animatedSticker: UpdateFilter = ( + msg + ) => msg.media?.type === 'sticker' && msg.media.isAnimated /** * Filter messages containing a video (webm) sticker */ - export const videoSticker: UpdateFilter = (msg) => - msg.media?.type === 'sticker' && msg.media.isVideoSticker + export const videoSticker: UpdateFilter = ( + msg + ) => msg.media?.type === 'sticker' && msg.media.isVideoSticker /** * Filter messages containing a video. @@ -845,23 +859,25 @@ export namespace filters { * * @param regex Regex to be matched */ - export const regex = ( - regex: RegExp - ): UpdateFilter< - Message | InlineQuery | ChosenInlineResult | CallbackQuery, - { match: RegExpMatchArray } - > => (obj) => { - const txt = extractText(obj) - if (!txt) return false + export const regex = + ( + regex: RegExp + ): UpdateFilter< + Message | InlineQuery | ChosenInlineResult | CallbackQuery, + { match: RegExpMatchArray } + > => + (obj) => { + const txt = extractText(obj) + if (!txt) return false - const m = txt.match(regex) + const m = txt.match(regex) - if (m) { - ;(obj as any).match = m - return true + if (m) { + ;(obj as any).match = m + return true + } + return false } - return false - } /** * Filter objects which contain the exact text given diff --git a/packages/dispatcher/src/handler.ts b/packages/dispatcher/src/handler.ts index 5816fc67..dd798644 100644 --- a/packages/dispatcher/src/handler.ts +++ b/packages/dispatcher/src/handler.ts @@ -18,6 +18,7 @@ import { ChatJoinRequestUpdate, } from '@mtcute/client' import { tl } from '@mtcute/tl' + import { PropagationAction } from './propagation' interface BaseUpdateHandler { diff --git a/packages/dispatcher/src/propagation.ts b/packages/dispatcher/src/propagation.ts index 9e55d55f..9679bb42 100644 --- a/packages/dispatcher/src/propagation.ts +++ b/packages/dispatcher/src/propagation.ts @@ -17,5 +17,5 @@ export enum PropagationAction { Stop = 'stop', StopChildren = 'stop-children', Continue = 'continue', - ToScene = 'scene' + ToScene = 'scene', } diff --git a/packages/dispatcher/src/state/key.ts b/packages/dispatcher/src/state/key.ts index 6364ecac..0aef4305 100644 --- a/packages/dispatcher/src/state/key.ts +++ b/packages/dispatcher/src/state/key.ts @@ -1,5 +1,5 @@ import { CallbackQuery, Message } from '@mtcute/client' -import { assertNever, MaybeAsync } from "@mtcute/core"; +import { assertNever, MaybeAsync } from '@mtcute/core' /** * Function that determines how the state key is derived. diff --git a/packages/dispatcher/src/state/storage.ts b/packages/dispatcher/src/state/storage.ts index 180fc74d..e1e61be0 100644 --- a/packages/dispatcher/src/state/storage.ts +++ b/packages/dispatcher/src/state/storage.ts @@ -71,7 +71,11 @@ export interface IStateStorage { * @returns Tuple containing the number of remaining and * unix time in ms when the user can try again */ - getRateLimit(key: string, limit: number, window: number): MaybeAsync<[number, number]> + getRateLimit( + key: string, + limit: number, + window: number + ): MaybeAsync<[number, number]> /** * Reset a rate limit. diff --git a/packages/dispatcher/src/state/update-state.ts b/packages/dispatcher/src/state/update-state.ts index 33b855b9..9249ac1f 100644 --- a/packages/dispatcher/src/state/update-state.ts +++ b/packages/dispatcher/src/state/update-state.ts @@ -1,12 +1,12 @@ -import { IStateStorage } from './storage' import { MtArgumentError, MtClientError } from '@mtcute/client' -import { sleep } from '@mtcute/core/src/utils/misc-utils' +import { sleep } from '@mtcute/core' +import { IStateStorage } from './storage' /** * Error thrown by `.rateLimit()` */ export class RateLimitError extends MtClientError { - constructor (readonly reset: number) { + constructor(readonly reset: number) { super(`You are being rate limited.`) } } @@ -130,11 +130,18 @@ export class UpdateState { * @param ttl TTL for the new state (in seconds) * @param forceLoad Whether to force load the old state from storage */ - async merge(state: Partial, fallback?: State, ttl?: number, forceLoad = false): Promise { + async merge( + state: Partial, + fallback?: State, + ttl?: number, + forceLoad = false + ): Promise { const old = await this.get(forceLoad) if (!old) { if (!fallback) - throw new MtArgumentError('Cannot use merge on empty state without fallback.') + throw new MtArgumentError( + 'Cannot use merge on empty state without fallback.' + ) await this.set({ ...fallback, ...state }, ttl) } else { @@ -196,8 +203,16 @@ export class UpdateState { * @returns Tuple containing the number of remaining and * unix time in ms when the user can try again */ - async rateLimit(key: string, limit: number, window: number): Promise<[number, number]> { - const [remaining, reset] = await this._localStorage.getRateLimit(`${key}:${this._localKey}`, limit, window) + async rateLimit( + key: string, + limit: number, + window: number + ): Promise<[number, number]> { + const [remaining, reset] = await this._localStorage.getRateLimit( + `${key}:${this._localKey}`, + limit, + window + ) if (!remaining) { throw new RateLimitError(reset) @@ -222,7 +237,11 @@ export class UpdateState { * @returns Tuple containing the number of remaining and * unix time in ms when the user can try again */ - async throttle(key: string, limit: number, window: number): Promise<[number, number]> { + async throttle( + key: string, + limit: number, + window: number + ): Promise<[number, number]> { try { return await this.rateLimit(key, limit, window) } catch (e: any) { diff --git a/packages/dispatcher/src/wizard.ts b/packages/dispatcher/src/wizard.ts index 59b0c002..94569f30 100644 --- a/packages/dispatcher/src/wizard.ts +++ b/packages/dispatcher/src/wizard.ts @@ -1,4 +1,5 @@ import { MaybeAsync, Message } from '@mtcute/client' + import { Dispatcher } from './dispatcher' import { UpdateState } from './state' import { filters } from './filters' @@ -18,7 +19,7 @@ import { filters } from './filters' export enum WizardSceneAction { Next = 'next', Stay = 'stay', - Exit = 'exit' + Exit = 'exit', } interface WizardInternalState { @@ -30,15 +31,15 @@ interface WizardInternalState { * that can be used to simplify implementing * step-by-step scenes. */ -export class WizardScene extends Dispatcher< - State & WizardInternalState, - SceneName -> { +export class WizardScene< + State, + SceneName extends string = string +> extends Dispatcher { private _steps = 0 private _defaultState: State & WizardInternalState = {} as any - setDefaultState (defaultState: State): void { + setDefaultState(defaultState: State): void { this._defaultState = defaultState as State & WizardInternalState } @@ -52,15 +53,20 @@ export class WizardScene extends Dispa /** * Add a step to the wizard */ - addStep(handler: (msg: Message, state: UpdateState) => MaybeAsync): void { + addStep( + handler: ( + msg: Message, + state: UpdateState + ) => MaybeAsync + ): void { const step = this._steps++ - const filter = filters.state((it) => it.$step === step) + const filter = filters.state( + (it) => it.$step === step + ) this.onNewMessage( - step === 0 - ? filters.or(filters.stateEmpty, filter) - : filter, + step === 0 ? filters.or(filters.stateEmpty, filter) : filter, async (msg: Message, state) => { const result = await handler(msg, state) @@ -75,7 +81,10 @@ export class WizardScene extends Dispa if (next === this._steps) { await state.exit() } else { - await state.merge({ $step: next }, this._defaultState) + await state.merge( + { $step: next }, + this._defaultState + ) } break } diff --git a/packages/dispatcher/tests/dispatcher.spec.ts b/packages/dispatcher/tests/dispatcher.spec.ts index 6f0b7bfe..293e7f33 100644 --- a/packages/dispatcher/tests/dispatcher.spec.ts +++ b/packages/dispatcher/tests/dispatcher.spec.ts @@ -1,47 +1,34 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { Dispatcher, handlers, PropagationAction } from '../src' -import { TelegramClient } from '@mtcute/client' +import { Dispatcher, PropagationAction } from '../src' +import { PeersIndex, TelegramClient } from '@mtcute/client' describe('Dispatcher', () => { // todo: replace with proper mocked TelegramClient const client = new TelegramClient({ apiId: 0, apiHash: '' }) + const emptyPeers = new PeersIndex() describe('Raw updates', () => { it('registers and unregisters handlers for raw updates', async () => { const dp = new Dispatcher(client) - const log: string[] = [] dp.onRawUpdate((cl, upd) => { - log.push('(wrap) received ' + upd._) - + log.push(`(first) received ${upd._}`) return PropagationAction.Continue }) - dp.addUpdateHandler( - handlers.rawUpdate((cl, upd) => { - log.push('(factory) received ' + upd._) - return PropagationAction.Continue - }) - ) - dp.addUpdateHandler({ - type: 'raw', - callback: (cl, upd) => { - log.push('(raw) received ' + upd._) - return PropagationAction.Continue - }, + dp.onRawUpdate((cl, upd) => { + log.push(`(second) received ${upd._}`) + return PropagationAction.Continue }) - await dp.dispatchUpdateNow({ _: 'updateConfig' }, {}, {}) - + await dp.dispatchRawUpdateNow({ _: 'updateConfig' }, emptyPeers) dp.removeUpdateHandler('raw') - - await dp.dispatchUpdateNow({ _: 'updateConfig' }, {}, {}) + await dp.dispatchRawUpdateNow({ _: 'updateConfig' }, emptyPeers) expect(log).eql([ - '(wrap) received updateConfig', - '(factory) received updateConfig', - '(raw) received updateConfig', + '(first) received updateConfig', + '(second) received updateConfig', ]) }) @@ -74,7 +61,7 @@ describe('Dispatcher', () => { } ) - await dp.dispatchUpdateNow({ _: 'updateConfig' }, {}, {}) + await dp.dispatchRawUpdateNow({ _: 'updateConfig' }, emptyPeers) expect(log).eql([ '(no) received updateConfig', @@ -104,7 +91,7 @@ describe('Dispatcher', () => { log.push('(grp2) received ' + upd._) }, 2) - await dp.dispatchUpdateNow({ _: 'updateConfig' }, {}, {}) + await dp.dispatchRawUpdateNow({ _: 'updateConfig' }, emptyPeers) expect(log).eql([ '(grp0) received updateConfig', @@ -135,7 +122,7 @@ describe('Dispatcher', () => { log.push('(grp2) received ' + upd._) }, 2) - await dp.dispatchUpdateNow({ _: 'updateConfig' }, {}, {}) + await dp.dispatchRawUpdateNow({ _: 'updateConfig' }, emptyPeers) expect(log).eql([ '(grp0) received updateConfig', @@ -145,7 +132,7 @@ describe('Dispatcher', () => { ]) }) - it('allows stopping any further propagation with StopPropagation', async () => { + it('allows stopping any further propagation with Stop', async () => { const dp = new Dispatcher(client) const log: string[] = [] @@ -160,7 +147,7 @@ describe('Dispatcher', () => { dp.onRawUpdate((cl, upd) => { log.push('(grp1) received ' + upd._) - return PropagationAction.Continue + return PropagationAction.Stop }, 1) dp.onRawUpdate((cl, upd) => { log.push('(grp1 2) received ' + upd._) @@ -169,7 +156,7 @@ describe('Dispatcher', () => { log.push('(grp2) received ' + upd._) }, 2) - await dp.dispatchUpdateNow({ _: 'updateConfig' }, {}, {}) + await dp.dispatchRawUpdateNow({ _: 'updateConfig' }, emptyPeers) expect(log).eql([ '(grp0) received updateConfig', @@ -195,7 +182,7 @@ describe('Dispatcher', () => { log.push('(child) received ' + upd._) }) - await dp.dispatchUpdateNow({ _: 'updateConfig' }, {}, {}) + await dp.dispatchRawUpdateNow({ _: 'updateConfig' }, emptyPeers) expect(log).eql([ '(parent) received updateConfig', @@ -238,7 +225,7 @@ describe('Dispatcher', () => { log.push('(child 2) received ' + upd._) }, 1) - await dp.dispatchUpdateNow({ _: 'updateConfig' }, {}, {}) + await dp.dispatchRawUpdateNow({ _: 'updateConfig' }, emptyPeers) expect(log).eql([ '(parent 0) received updateConfig', diff --git a/packages/file-id/package.json b/packages/file-id/package.json index ae7c37e9..7a3ce03c 100644 --- a/packages/file-id/package.json +++ b/packages/file-id/package.json @@ -7,7 +7,7 @@ "license": "LGPL-3.0", "main": "src/index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/file-id/src/convert.ts b/packages/file-id/src/convert.ts index 810859c4..fba2f4ad 100644 --- a/packages/file-id/src/convert.ts +++ b/packages/file-id/src/convert.ts @@ -1,16 +1,19 @@ -import { tl } from '@mtcute/tl' -import { tdFileId, tdFileId as td } from './types' -import { parseFileId } from './parse' -import { assertNever, getBasicPeerType, markedPeerIdToBare } from "@mtcute/core"; -import FileType = tdFileId.FileType import Long from 'long' +import { tl } from '@mtcute/tl' +import { assertNever, getBasicPeerType, markedPeerIdToBare } from '@mtcute/core' + +import { tdFileId as td } from './types' +import { parseFileId } from './parse' +import FileType = td.FileType const EMPTY_BUFFER = Buffer.alloc(0) type FileId = td.RawFullRemoteFileLocation function dialogPhotoToInputPeer( - dialog: td.RawPhotoSizeSourceDialogPhoto | td.RawPhotoSizeSourceDialogPhotoLegacy + dialog: + | td.RawPhotoSizeSourceDialogPhoto + | td.RawPhotoSizeSourceDialogPhotoLegacy ): tl.TypeInputPeer { const markedPeerId = dialog.id const peerType = getBasicPeerType(markedPeerId) @@ -177,7 +180,7 @@ export function fileIdToInputFileLocation( id: loc.source.id, accessHash: loc.source.accessHash, }, - thumbVersion: loc.source.version + thumbVersion: loc.source.version, } default: assertNever(loc.source) diff --git a/packages/file-id/src/parse.ts b/packages/file-id/src/parse.ts index 771cbe3c..03aca773 100644 --- a/packages/file-id/src/parse.ts +++ b/packages/file-id/src/parse.ts @@ -1,8 +1,9 @@ -import { telegramRleDecode } from './utils' -import { tdFileId as td } from './types' import { parseUrlSafeBase64 } from '@mtcute/core' import { TlBinaryReader } from '@mtcute/tl-runtime' +import { telegramRleDecode } from './utils' +import { tdFileId as td } from './types' + function parseWebFileLocation( reader: TlBinaryReader ): td.RawWebRemoteFileLocation { diff --git a/packages/file-id/src/serialize-unique.ts b/packages/file-id/src/serialize-unique.ts index 2a62a044..c69d9e29 100644 --- a/packages/file-id/src/serialize-unique.ts +++ b/packages/file-id/src/serialize-unique.ts @@ -1,9 +1,9 @@ -import { tdFileId, tdFileId as td } from './types' -import { assertNever, encodeUrlSafeBase64 } from "@mtcute/core"; -import { telegramRleEncode } from './utils' -import FileType = tdFileId.FileType +import { assertNever, encodeUrlSafeBase64 } from '@mtcute/core' import { TlBinaryWriter } from '@mtcute/tl-runtime' +import { tdFileId as td } from './types' +import { telegramRleEncode } from './utils' + type InputUniqueLocation = | Pick | Pick @@ -25,11 +25,11 @@ export function toUniqueFileId( location: Omit ): string export function toUniqueFileId( - type: FileType, + type: td.FileType, location: InputUniqueLocation ): string export function toUniqueFileId( - first: FileType | Omit, + first: td.FileType | Omit, second?: InputUniqueLocation ): string { const inputType = typeof first === 'number' ? first : first.type @@ -141,7 +141,8 @@ export function toUniqueFileId( break } case 'web': - writer = TlBinaryWriter.alloc({}, + writer = TlBinaryWriter.alloc( + {}, Buffer.byteLength(inputLocation.url, 'utf-8') + 8 ) writer.int(type) diff --git a/packages/file-id/src/serialize.ts b/packages/file-id/src/serialize.ts index 9f0b58f4..deae783a 100644 --- a/packages/file-id/src/serialize.ts +++ b/packages/file-id/src/serialize.ts @@ -1,8 +1,9 @@ -import { tdFileId as td } from './types' -import { assertNever, encodeUrlSafeBase64 } from "@mtcute/core"; -import { telegramRleEncode } from './utils' +import { assertNever, encodeUrlSafeBase64 } from '@mtcute/core' import { TlBinaryWriter } from '@mtcute/tl-runtime' +import { tdFileId as td } from './types' +import { telegramRleEncode } from './utils' + const SUFFIX = Buffer.from([td.CURRENT_VERSION, td.PERSISTENT_ID_VERSION]) /** diff --git a/packages/file-id/tests/parse.spec.ts b/packages/file-id/tests/parse.spec.ts index 6412bee5..4f391715 100644 --- a/packages/file-id/tests/parse.spec.ts +++ b/packages/file-id/tests/parse.spec.ts @@ -1,8 +1,8 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { parseFileId } from '../src/parse' +import { parseFileId } from '../src' import { tdFileId as td } from '../src/types' -import bigInt from 'big-integer' +import Long from 'long' // test file IDs are partially taken from https://github.com/luckydonald/telegram_file_id @@ -23,8 +23,8 @@ describe('parsing file ids', () => { ), location: { _: 'common', - accessHash: bigInt('5232780349138767832'), - id: bigInt('541175087705905756'), + accessHash: Long.fromString('5232780349138767832'), + id: Long.fromString('541175087705905756'), }, type: td.FileType.Sticker, } @@ -40,8 +40,8 @@ describe('parsing file ids', () => { ), location: { _: 'common', - accessHash: bigInt('-4610306729174144868'), - id: bigInt('5213102278772264052'), + accessHash: Long.fromString('-4610306729174144868'), + id: Long.fromString('5213102278772264052'), }, type: td.FileType.Document, } @@ -60,15 +60,13 @@ describe('parsing file ids', () => { ), location: { _: 'photo', - accessHash: bigInt('5232780349138767832'), - id: bigInt('541175087705905756'), - localId: 601, + accessHash: Long.fromString('5232780349138767832'), + id: Long.fromString('541175087705905756'), source: { _: 'thumbnail', fileType: td.FileType.Thumbnail, thumbnailType: 'm', }, - volumeId: bigInt('250829997'), }, type: td.FileType.Thumbnail, } @@ -83,16 +81,16 @@ describe('parsing file ids', () => { fileReference: null, location: { _: 'photo', - accessHash: bigInt.zero, - id: bigInt.zero, - localId: 172874, + accessHash: Long.ZERO, + id: Long.ZERO, source: { - _: 'dialogPhoto', - id: bigInt('-452451701'), - accessHash: bigInt.zero, + _: 'dialogPhotoLegacy', + id: -452451701, + accessHash: Long.ZERO, big: true, + localId: 172874, + volumeId: Long.fromString('200116400297'), }, - volumeId: bigInt('200116400297'), }, type: td.FileType.ProfilePhoto, }) @@ -104,16 +102,16 @@ describe('parsing file ids', () => { fileReference: null, location: { _: 'photo', - accessHash: bigInt.zero, - id: bigInt.zero, - localId: 172872, + accessHash: Long.ZERO, + id: Long.ZERO, source: { - _: 'dialogPhoto', - id: bigInt('-452451701'), - accessHash: bigInt.zero, + _: 'dialogPhotoLegacy', + id: -452451701, + accessHash: Long.ZERO, big: false, + localId: 172872, + volumeId: Long.fromString('200116400297'), }, - volumeId: bigInt('200116400297'), }, type: td.FileType.ProfilePhoto, }) @@ -127,16 +125,16 @@ describe('parsing file ids', () => { fileReference: null, location: { _: 'photo', - accessHash: bigInt.zero, - id: bigInt.zero, - localId: 338431, + accessHash: Long.ZERO, + id: Long.ZERO, source: { - _: 'dialogPhoto', - id: bigInt('-1001326609710'), - accessHash: bigInt('4396274664911437744'), + _: 'dialogPhotoLegacy', + id: -1001326609710, + accessHash: Long.fromString('4396274664911437744'), big: true, + localId: 338431, + volumeId: Long.fromString('247538121'), }, - volumeId: bigInt('247538121'), }, type: td.FileType.ProfilePhoto, }) @@ -147,16 +145,16 @@ describe('parsing file ids', () => { fileReference: null, location: { _: 'photo', - accessHash: bigInt.zero, - id: bigInt.zero, - localId: 338429, + accessHash: Long.ZERO, + id: Long.ZERO, source: { - _: 'dialogPhoto', - id: bigInt('-1001326609710'), - accessHash: bigInt('4396274664911437744'), + _: 'dialogPhotoLegacy', + id: -1001326609710, + accessHash: Long.fromString('4396274664911437744'), big: false, + volumeId: Long.fromString('247538121'), + localId: 338429, }, - volumeId: bigInt('247538121'), }, type: td.FileType.ProfilePhoto, }) @@ -169,8 +167,8 @@ describe('parsing file ids', () => { fileReference: null, location: { _: 'common', - accessHash: bigInt('2166960137789870152'), - id: bigInt('1282363671355326586'), + accessHash: Long.fromString('2166960137789870152'), + id: Long.fromString('1282363671355326586'), }, type: td.FileType.Sticker, }) diff --git a/packages/file-id/tests/serialize-unique.spec.ts b/packages/file-id/tests/serialize-unique.spec.ts index e76ec902..db539325 100644 --- a/packages/file-id/tests/serialize-unique.spec.ts +++ b/packages/file-id/tests/serialize-unique.spec.ts @@ -1,7 +1,7 @@ import { describe } from 'mocha' import { expect } from 'chai' -import { parseFileId } from '../src/parse' -import { toUniqueFileId } from '../src/serialize-unique' + +import { parseFileId, toUniqueFileId } from '../src' // test file IDs are partially taken from https://github.com/luckydonald/telegram_file_id @@ -25,7 +25,7 @@ describe('serializing unique file ids', () => { ) test( 'AAMCAgADGQEAAQmfM2CK3TQgOwp3Ts51J5qfDPyix5xgAAJ0DAAC56hYSJxo-8105gTAT_bYoy4AAwEAB20AA0JBAAIfBA', - 'AQADT_bYoy4AA0JBAAI' + 'AQADdAwAAueoWEhy' ) test( 'CAACAgIAAxkBAAEJny9gituz1_V_uSKBUuG_nhtzEtFOeQACXFoAAuCjggfYjw_KAAGSnkgfBA', diff --git a/packages/file-id/tests/serialize.spec.ts b/packages/file-id/tests/serialize.spec.ts deleted file mode 100644 index 5032da5d..00000000 --- a/packages/file-id/tests/serialize.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { describe } from 'mocha' -import { expect } from 'chai' -import { parseFileId, toFileId } from '../src' - -describe('serializing to file ids', () => { - it('serializes previously parsed file ids', () => { - const test = (fileId: string) => { - expect(toFileId(parseFileId(fileId))).eq(fileId) - } - - test( - 'CAACAgIAAxkBAAEJny9gituz1_V_uSKBUuG_nhtzEtFOeQACXFoAAuCjggfYjw_KAAGSnkgfBA' - ) - test( - 'BQACAgIAAxkBAAEJnzNgit00IDsKd07OdSeanwz8osecYAACdAwAAueoWEicaPvNdOYEwB8E' - ) - test( - 'AAMCAgADGQEAAQmfL2CK27PX9X-5IoFS4b-eG3MS0U55AAJcWgAC4KOCB9iPD8oAAZKeSK1c8w4ABAEAB20AA1kCAAIfBA' - ) - test('AQADAgATqfDdly4AAwMAA4siCOX_____AAhKowIAAR8E') - test('AQADAgATqfDdly4AAwIAA4siCOX_____AAhIowIAAR8E') - test('AQADAgATySHBDgAEAwAD0npI3Bb___-wfxjpg7QCPf8pBQABHwQ') - test('AQADAgATySHBDgAEAgAD0npI3Bb___-wfxjpg7QCPf0pBQABHwQ') - test('CAADAQADegAD997LEUiQZafDlhIeHwQ') - }) -}) diff --git a/packages/file-id/tests/utils.spec.ts b/packages/file-id/tests/utils.spec.ts index c5e7d25a..02c93d6d 100644 --- a/packages/file-id/tests/utils.spec.ts +++ b/packages/file-id/tests/utils.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { telegramRleDecode, telegramRleEncode } from '../src/utils' describe('telegramRleEncode', () => { diff --git a/packages/html-parser/package.json b/packages/html-parser/package.json index afe6770c..c0fa0c3c 100644 --- a/packages/html-parser/package.json +++ b/packages/html-parser/package.json @@ -7,7 +7,7 @@ "license": "LGPL-3.0", "main": "src/index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "coverage": "nyc npm run test", "build": "tsc", "docs": "npx typedoc" diff --git a/packages/html-parser/src/index.ts b/packages/html-parser/src/index.ts index 9e4dbc75..fe0f10cd 100644 --- a/packages/html-parser/src/index.ts +++ b/packages/html-parser/src/index.ts @@ -1,11 +1,11 @@ +import { Parser } from 'htmlparser2' +import Long from 'long' import type { IMessageEntityParser, MessageEntity, FormattedString, + tl, } from '@mtcute/client' -import { tl } from '@mtcute/tl' -import { Parser } from 'htmlparser2' -import Long from 'long' const MENTION_REGEX = /^tg:\/\/user\?id=(\d+)(?:&hash=(-?[0-9a-fA-F]+)(?:&|$)|&|$)/ @@ -27,10 +27,7 @@ export function html( if (typeof it === 'boolean' || !it) return if (typeof it === 'string') { - it = HtmlMessageEntityParser.escape( - it, - !!str.match(/=['"]$/) - ) + it = HtmlMessageEntityParser.escape(it, !!str.match(/=['"]$/)) } else { if (it.mode && it.mode !== 'html') throw new Error(`Incompatible parse mode: ${it.mode}`) diff --git a/packages/html-parser/tests/html-parser.spec.ts b/packages/html-parser/tests/html-parser.spec.ts index 89312b67..107a5488 100644 --- a/packages/html-parser/tests/html-parser.spec.ts +++ b/packages/html-parser/tests/html-parser.spec.ts @@ -1,9 +1,10 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { tl } from '@mtcute/tl' -import { HtmlMessageEntityParser, html } from '../src' -import { MessageEntity, FormattedString } from '@mtcute/client' import Long from 'long' +import { tl } from '@mtcute/tl' +import { MessageEntity, FormattedString } from '@mtcute/client' + +import { HtmlMessageEntityParser, html } from '../src' const createEntity = ( type: T, @@ -260,11 +261,7 @@ describe('HtmlMessageEntityParser', () => { }) it('should replace newlines with
outside pre', () => { - test( - 'plain\n\nplain', - [], - 'plain

plain' - ) + test('plain\n\nplain', [], 'plain

plain') test( 'plain\n\nplain', [createEntity('messageEntityBold', 0, 12)], @@ -278,11 +275,7 @@ describe('HtmlMessageEntityParser', () => { }) it('should replace multiple spaces with  ', () => { - test( - 'plain plain', - [], - 'plain    plain' - ) + test('plain plain', [], 'plain    plain') }) }) @@ -605,7 +598,9 @@ describe('HtmlMessageEntityParser', () => { const unsafeString = new FormattedString('<&>') expect(html`${unsafeString}`.value).eq('<&>') - expect(html`${unsafeString} ${unsafeString2}`.value).eq('<&> <&>') + expect(html`${unsafeString} ${unsafeString2}`.value).eq( + '<&> <&>' + ) expect(html`${unsafeString} text`.value).eq( '<&> text' ) diff --git a/packages/http-proxy/index.ts b/packages/http-proxy/index.ts index 0edd8a60..bdcd0c1a 100644 --- a/packages/http-proxy/index.ts +++ b/packages/http-proxy/index.ts @@ -2,7 +2,7 @@ import { IntermediatePacketCodec, BaseTcpTransport, TransportState, - tl + tl, } from '@mtcute/core' import { connect as connectTcp } from 'net' import { connect as connectTls, SecureContextOptions } from 'tls' diff --git a/packages/http-proxy/package.json b/packages/http-proxy/package.json index 34e76a6e..583c25e1 100644 --- a/packages/http-proxy/package.json +++ b/packages/http-proxy/package.json @@ -7,7 +7,6 @@ "license": "LGPL-3.0", "main": "index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/markdown-parser/package.json b/packages/markdown-parser/package.json index a281a2d5..a3502588 100644 --- a/packages/markdown-parser/package.json +++ b/packages/markdown-parser/package.json @@ -7,7 +7,7 @@ "license": "LGPL-3.0", "main": "src/index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "coverage": "nyc npm run test", "build": "tsc", "docs": "npx typedoc" diff --git a/packages/markdown-parser/src/index.ts b/packages/markdown-parser/src/index.ts index 7ccda574..a683b2bb 100644 --- a/packages/markdown-parser/src/index.ts +++ b/packages/markdown-parser/src/index.ts @@ -1,7 +1,6 @@ -import type { IMessageEntityParser, MessageEntity } from '@mtcute/client' -import { tl } from '@mtcute/tl' -import { FormattedString } from '@mtcute/client' import Long from 'long' +import type { IMessageEntityParser, MessageEntity, tl } from '@mtcute/client' +import { FormattedString } from '@mtcute/client' const MENTION_REGEX = /^tg:\/\/user\?id=(\d+)(?:&hash=(-?[0-9a-fA-F]+)(?:&|$)|&|$)/ diff --git a/packages/markdown-parser/tests/markdown-parser.spec.ts b/packages/markdown-parser/tests/markdown-parser.spec.ts index 8041e417..72ec8d9d 100644 --- a/packages/markdown-parser/tests/markdown-parser.spec.ts +++ b/packages/markdown-parser/tests/markdown-parser.spec.ts @@ -1,9 +1,10 @@ import { describe, it } from 'mocha' import { expect } from 'chai' +import Long from 'long' import { tl } from '@mtcute/tl' import { MessageEntity, FormattedString } from '@mtcute/client' + import { MarkdownMessageEntityParser, md } from '../src' -import Long from 'long' const createEntity = ( type: T, @@ -655,8 +656,12 @@ describe('MarkdownMessageEntityParser', () => { const unsafeString = '__[]__' expect(md`${unsafeString}`.value).eq('\\_\\_\\[\\]\\_\\_') - expect(md`${unsafeString} **text**`.value).eq('\\_\\_\\[\\]\\_\\_ **text**') - expect(md`**text** ${unsafeString}`.value).eq('**text** \\_\\_\\[\\]\\_\\_') + expect(md`${unsafeString} **text**`.value).eq( + '\\_\\_\\[\\]\\_\\_ **text**' + ) + expect(md`**text** ${unsafeString}`.value).eq( + '**text** \\_\\_\\[\\]\\_\\_' + ) expect(md`**${unsafeString}**`.value).eq('**\\_\\_\\[\\]\\_\\_**') }) @@ -665,10 +670,14 @@ describe('MarkdownMessageEntityParser', () => { const unsafeString = new FormattedString('__[]__') expect(md`${unsafeString}`.value).eq('__[]__') - expect(md`${unsafeString} ${unsafeString2}`.value).eq('__[]__ \\_\\_\\[\\]\\_\\_') + expect(md`${unsafeString} ${unsafeString2}`.value).eq( + '__[]__ \\_\\_\\[\\]\\_\\_' + ) expect(md`${unsafeString} **text**`.value).eq('__[]__ **text**') expect(md`**text** ${unsafeString}`.value).eq('**text** __[]__') - expect(md`**${unsafeString} ${unsafeString2}**`.value).eq('**__[]__ \\_\\_\\[\\]\\_\\_**') + expect(md`**${unsafeString} ${unsafeString2}**`.value).eq( + '**__[]__ \\_\\_\\[\\]\\_\\_**' + ) }) it('should error with incompatible FormattedString', () => { diff --git a/packages/mtproxy/index.ts b/packages/mtproxy/index.ts index d669979e..72735003 100644 --- a/packages/mtproxy/index.ts +++ b/packages/mtproxy/index.ts @@ -1,3 +1,4 @@ +import { connect } from 'net' import { IntermediatePacketCodec, ObfuscatedPacketCodec, @@ -6,9 +7,9 @@ import { parseUrlSafeBase64, BaseTcpTransport, TransportState, - tl + tl, } from '@mtcute/core' -import { connect } from 'net' + import { FakeTlsPacketCodec, generateFakeTlsHeader } from './fake-tls' export interface MtProxySettings { diff --git a/packages/mtproxy/package.json b/packages/mtproxy/package.json index d3c5a5b8..b6e5a1fe 100644 --- a/packages/mtproxy/package.json +++ b/packages/mtproxy/package.json @@ -7,7 +7,6 @@ "license": "LGPL-3.0", "main": "index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/node/index.ts b/packages/node/index.ts index 42bfa449..e7faed06 100644 --- a/packages/node/index.ts +++ b/packages/node/index.ts @@ -1,9 +1,10 @@ +import { createInterface, Interface as RlInterface } from 'readline' + import { TelegramClient, User } from '@mtcute/client' import { BaseTelegramClient } from '@mtcute/core' import { HtmlMessageEntityParser } from '@mtcute/html-parser' import { MarkdownMessageEntityParser } from '@mtcute/markdown-parser' import { SqliteStorage } from '@mtcute/sqlite' -import { createInterface, Interface as RlInterface } from 'readline' export * from '@mtcute/dispatcher' export * from '@mtcute/client' diff --git a/packages/node/package.json b/packages/node/package.json index cecf62a6..02b50df8 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -7,7 +7,6 @@ "license": "LGPL-3.0", "main": "index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/socks-proxy/index.ts b/packages/socks-proxy/index.ts index b2f24739..c7fb9c15 100644 --- a/packages/socks-proxy/index.ts +++ b/packages/socks-proxy/index.ts @@ -1,14 +1,15 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import { normalize } from 'ip6' +import { connect } from 'net' + import { IntermediatePacketCodec, BaseTcpTransport, TransportState, tl, - assertNever -} from "@mtcute/core"; -import { connect } from 'net' -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import { normalize } from 'ip6' + assertNever, +} from '@mtcute/core' /** * An error has occurred while connecting to an SOCKS proxy @@ -448,7 +449,8 @@ export abstract class BaseSocksTcpTransport extends BaseTcpTransport { } break } - default: assertNever(state) + default: + assertNever(state) } } diff --git a/packages/socks-proxy/package.json b/packages/socks-proxy/package.json index da05db0c..a974d9e7 100644 --- a/packages/socks-proxy/package.json +++ b/packages/socks-proxy/package.json @@ -7,7 +7,6 @@ "license": "LGPL-3.0", "main": "index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/sqlite/index.ts b/packages/sqlite/index.ts index ee0f3db3..a30df1eb 100644 --- a/packages/sqlite/index.ts +++ b/packages/sqlite/index.ts @@ -1,5 +1,7 @@ // noinspection SqlResolve +import sqlite3 from 'better-sqlite3' + import { ITelegramStorage, longFromFastString, @@ -14,7 +16,6 @@ import { TlReaderMap, TlWriterMap, } from '@mtcute/core' -import sqlite3 from 'better-sqlite3' // todo: add testMode to "self" diff --git a/packages/sqlite/package.json b/packages/sqlite/package.json index bae3c8fb..d31bce3c 100644 --- a/packages/sqlite/package.json +++ b/packages/sqlite/package.json @@ -7,7 +7,6 @@ "license": "LGPL-3.0", "main": "index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/tl-runtime/package.json b/packages/tl-runtime/package.json index 9c5c5399..07a2d977 100644 --- a/packages/tl-runtime/package.json +++ b/packages/tl-runtime/package.json @@ -7,7 +7,7 @@ "license": "LGPL-3.0", "main": "src/index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/tl-runtime/src/platform/gzip.ts b/packages/tl-runtime/src/platform/gzip.ts index 1d87f757..8a336dc2 100644 --- a/packages/tl-runtime/src/platform/gzip.ts +++ b/packages/tl-runtime/src/platform/gzip.ts @@ -7,7 +7,9 @@ export function gzipInflate(buf: Buffer): Buffer { export function gzipDeflate(buf: Buffer, maxRatio?: number): Buffer | null { if (maxRatio) { try { - return deflateSync(buf, { maxOutputLength: Math.floor(buf.length * maxRatio) }) + return deflateSync(buf, { + maxOutputLength: Math.floor(buf.length * maxRatio), + }) } catch (e: any) { if (e.code === 'ERR_BUFFER_TOO_LARGE') { return null diff --git a/packages/tl-runtime/src/reader.ts b/packages/tl-runtime/src/reader.ts index 74d7599a..edde15a0 100644 --- a/packages/tl-runtime/src/reader.ts +++ b/packages/tl-runtime/src/reader.ts @@ -1,6 +1,7 @@ -import { gzipInflate } from './platform/gzip' import Long from 'long' +import { gzipInflate } from './platform/gzip' + const TWO_PWR_32_DBL = (1 << 16) * (1 << 16) /** diff --git a/packages/tl-runtime/src/writer.ts b/packages/tl-runtime/src/writer.ts index 51b6fd2b..1771e737 100644 --- a/packages/tl-runtime/src/writer.ts +++ b/packages/tl-runtime/src/writer.ts @@ -156,9 +156,12 @@ export class TlBinaryWriter { int53(val: number): void { // inlined fromNumber from Long - this.buffer.writeInt32LE((val % TWO_PWR_32_DBL) | 0, this.pos) + this.buffer.writeInt32LE(val % TWO_PWR_32_DBL | 0, this.pos) if (val < 0) { - this.buffer.writeInt32LE((val / TWO_PWR_32_DBL - 1) | 0, this.pos + 4) + this.buffer.writeInt32LE( + (val / TWO_PWR_32_DBL - 1) | 0, + this.pos + 4 + ) } else { this.buffer.writeInt32LE((val / TWO_PWR_32_DBL) | 0, this.pos + 4) } diff --git a/packages/tl-runtime/tests/binary-reader.spec.ts b/packages/tl-runtime/tests/binary-reader.spec.ts index 522f8f26..d92ea4f7 100644 --- a/packages/tl-runtime/tests/binary-reader.spec.ts +++ b/packages/tl-runtime/tests/binary-reader.spec.ts @@ -1,9 +1,10 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { TlBinaryReader, TlReaderMap } from '../src' import Long from 'long' import { randomBytes } from 'crypto' +import { TlBinaryReader, TlReaderMap } from '../src' + describe('TlBinaryReader', () => { it('should read int32', () => { expect(TlBinaryReader.manual(Buffer.from([0, 0, 0, 0])).int()).eq(0) @@ -12,10 +13,7 @@ describe('TlBinaryReader', () => { 67305985 ) expect( - new TlBinaryReader( - {}, - Buffer.from([0xff, 0xff, 0xff, 0xff]) - ).int() + new TlBinaryReader({}, Buffer.from([0xff, 0xff, 0xff, 0xff])).int() ).eq(-1) }) @@ -26,22 +24,23 @@ describe('TlBinaryReader', () => { 67305985 ) expect( - new TlBinaryReader( - {}, - Buffer.from([0xff, 0xff, 0xff, 0xff]) - ).uint() + new TlBinaryReader({}, Buffer.from([0xff, 0xff, 0xff, 0xff])).uint() ).eq(4294967295) }) it('should read int53', () => { - expect(TlBinaryReader.manual(Buffer.from([0, 0, 0, 0, 0, 0, 0, 0])).int53()).eq(0) - expect(TlBinaryReader.manual(Buffer.from([1, 0, 0, 0, 0, 0, 0, 0])).int53()).eq(1) - expect(TlBinaryReader.manual(Buffer.from([1, 2, 3, 4, 0, 0, 0, 0])).int53()).eq( - 67305985 - ) - expect(TlBinaryReader.manual(Buffer.from([1, 0, 1, 0, 1, 0, 1, 0])).int53()).eq( - 281479271743489 - ) + expect( + TlBinaryReader.manual(Buffer.from([0, 0, 0, 0, 0, 0, 0, 0])).int53() + ).eq(0) + expect( + TlBinaryReader.manual(Buffer.from([1, 0, 0, 0, 0, 0, 0, 0])).int53() + ).eq(1) + expect( + TlBinaryReader.manual(Buffer.from([1, 2, 3, 4, 0, 0, 0, 0])).int53() + ).eq(67305985) + expect( + TlBinaryReader.manual(Buffer.from([1, 0, 1, 0, 1, 0, 1, 0])).int53() + ).eq(281479271743489) expect( new TlBinaryReader( {}, @@ -120,9 +119,9 @@ describe('TlBinaryReader', () => { expect([ ...TlBinaryReader.manual(Buffer.from([1, 2, 3, 4])).raw(2), ]).eql([1, 2]) - expect([ - ...TlBinaryReader.manual(Buffer.from([1, 2, 3, 4])).raw(), - ]).eql([1, 2, 3, 4]) + expect([...TlBinaryReader.manual(Buffer.from([1, 2, 3, 4])).raw()]).eql( + [1, 2, 3, 4] + ) expect([ ...TlBinaryReader.manual(Buffer.from([1, 2, 3, 4])).raw(0), ]).eql([]) diff --git a/packages/tl-runtime/tests/binary-writer.spec.ts b/packages/tl-runtime/tests/binary-writer.spec.ts index 15599eb6..856f9760 100644 --- a/packages/tl-runtime/tests/binary-writer.spec.ts +++ b/packages/tl-runtime/tests/binary-writer.spec.ts @@ -1,13 +1,10 @@ import { describe, it } from 'mocha' import { expect } from 'chai' -import { - TlBinaryWriter, - TlSerializationCounter, - TlWriterMap -} from '../src' import Long from 'long' import { randomBytes } from 'crypto' +import { TlBinaryWriter, TlSerializationCounter, TlWriterMap } from '../src' + describe('TlBinaryWriter', () => { const testSingleMethod = ( size: number, @@ -37,8 +34,12 @@ describe('TlBinaryWriter', () => { it('should write int53', () => { expect(testSingleMethod(8, (w) => w.int53(0))).eq('0000000000000000') expect(testSingleMethod(8, (w) => w.int53(1))).eq('0100000000000000') - expect(testSingleMethod(8, (w) => w.int53(67305985))).eq('0102030400000000') - expect(testSingleMethod(8, (w) => w.int53(281479271743489))).eq('0100010001000100') + expect(testSingleMethod(8, (w) => w.int53(67305985))).eq( + '0102030400000000' + ) + expect(testSingleMethod(8, (w) => w.int53(281479271743489))).eq( + '0100010001000100' + ) expect(testSingleMethod(8, (w) => w.int53(-1))).eq('ffffffffffffffff') }) @@ -47,10 +48,14 @@ describe('TlBinaryWriter', () => { 'ffffffffffffffff' ) expect( - testSingleMethod(8, (w) => w.long(Long.fromString('8671175386481439762'))) + testSingleMethod(8, (w) => + w.long(Long.fromString('8671175386481439762')) + ) ).eq('1234567812345678') expect( - testSingleMethod(8, (w) => w.long(Long.fromString('-6700480189419895787'))) + testSingleMethod(8, (w) => + w.long(Long.fromString('-6700480189419895787')) + ) ).eq('15c415b5c41c03a3') }) @@ -138,10 +143,14 @@ describe('TlBinaryWriter', () => { expect(length).eq(20) expect( - testSingleMethod(length, (w) => { - w.object(object1) - w.object(object2) - }, stubObjectsMap) + testSingleMethod( + length, + (w) => { + w.object(object1) + w.object(object2) + }, + stubObjectsMap + ) ).eq('efbeadde01000000addecefadec0adba02000000') }) @@ -161,16 +170,20 @@ describe('TlBinaryWriter', () => { } const length = - TlSerializationCounter.countNeededBytes(stubObjectsMap, object1,) + - TlSerializationCounter.countNeededBytes(stubObjectsMap, object2,) + - TlSerializationCounter.countNeededBytes(stubObjectsMap, object3,) + + TlSerializationCounter.countNeededBytes(stubObjectsMap, object1) + + TlSerializationCounter.countNeededBytes(stubObjectsMap, object2) + + TlSerializationCounter.countNeededBytes(stubObjectsMap, object3) + 8 // because technically in tl vector can't be top-level, but whatever :shrug: expect(length).eq(48) expect( - testSingleMethod(length, (w) => { - w.vector(w.object as any, [object1, object2, object3]) - }, stubObjectsMap) + testSingleMethod( + length, + (w) => { + w.vector(w.object as any, [object1, object2, object3]) + }, + stubObjectsMap + ) ).eq( '15c4b51c03000000efbeadde01000000addecefadec0adba020000003d0cbfbe15c4b51c020000000100000002000000' ) @@ -190,17 +203,19 @@ describe('TlBinaryWriter', () => { 'hex' ), pq: Buffer.from('17ED48941A08F981', 'hex'), - serverPublicKeyFingerprints: [Long.fromString('c3b42b026ce86b21', 16)], + serverPublicKeyFingerprints: [ + Long.fromString('c3b42b026ce86b21', 16), + ], } const map: TlWriterMap = { - 'mt_resPQ': function (w, obj) { + mt_resPQ: function (w, obj) { w.uint(85337187) w.int128(obj.nonce) w.int128(obj.serverNonce) w.bytes(obj.pq) w.vector(w.long, obj.serverPublicKeyFingerprints) - } + }, } const length = @@ -209,13 +224,17 @@ describe('TlBinaryWriter', () => { expect(length).eq(expected.length / 2) expect( - testSingleMethod(length, (w) => { - w.long(Long.ZERO) // authKeyId - w.long(Long.fromString('51E57AC91E83C801', true, 16)) // messageId - w.uint(64) // messageLength + testSingleMethod( + length, + (w) => { + w.long(Long.ZERO) // authKeyId + w.long(Long.fromString('51E57AC91E83C801', true, 16)) // messageId + w.uint(64) // messageLength - w.object(resPq) - }, map) + w.object(resPq) + }, + map + ) ).eq(expected) }) }) diff --git a/packages/tl-utils/package.json b/packages/tl-utils/package.json index e79db61e..e9584545 100644 --- a/packages/tl-utils/package.json +++ b/packages/tl-utils/package.json @@ -7,7 +7,7 @@ "license": "LGPL-3.0", "main": "index.ts", "scripts": { - "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "test": "mocha -r ts-node/register \"tests/**/*.spec.ts\"", "docs": "npx typedoc", "build": "tsc" }, diff --git a/packages/tl-utils/src/codegen/errors.ts b/packages/tl-utils/src/codegen/errors.ts index 3fc8ec82..2da8403f 100644 --- a/packages/tl-utils/src/codegen/errors.ts +++ b/packages/tl-utils/src/codegen/errors.ts @@ -3,13 +3,8 @@ import { TlError, TlErrors } from '../types' export function errorCodeToClassName(code: string): string { let str = - camelToPascal( - snakeToCamel( - code - .toLowerCase() - .replace(/ /g, '_') - ) - ) + 'Error' + camelToPascal(snakeToCamel(code.toLowerCase().replace(/ /g, '_'))) + + 'Error' if (str[0].match(/\d/)) { str = '_' + str } diff --git a/packages/tl-utils/src/codegen/types.ts b/packages/tl-utils/src/codegen/types.ts index 64117dbb..e6409c66 100644 --- a/packages/tl-utils/src/codegen/types.ts +++ b/packages/tl-utils/src/codegen/types.ts @@ -127,7 +127,7 @@ export function generateTypescriptDefinitionsForTlEntry( let type = arg.type let typeFinal = false - if (type[0] === '!') type = type.substr(1) + if (type[0] === '!') type = type.substring(1) if (type in genericsIndex) { typeFinal = true diff --git a/packages/tl-utils/src/codegen/utils.ts b/packages/tl-utils/src/codegen/utils.ts index 7e806940..4860c332 100644 --- a/packages/tl-utils/src/codegen/utils.ts +++ b/packages/tl-utils/src/codegen/utils.ts @@ -1,11 +1,11 @@ export const snakeToCamel = (s: string): string => { return s.replace(/(? { - return $1.substr(1).toUpperCase() + return $1.substring(1).toUpperCase() }) } export const camelToPascal = (s: string): string => - s[0].toUpperCase() + s.substr(1) + s[0].toUpperCase() + s.substring(1) export function jsComment(s: string): string { return ( diff --git a/packages/tl-utils/src/ctor-id.ts b/packages/tl-utils/src/ctor-id.ts index f8ea3632..20ece255 100644 --- a/packages/tl-utils/src/ctor-id.ts +++ b/packages/tl-utils/src/ctor-id.ts @@ -1,4 +1,5 @@ import CRC32 from 'crc-32' + import { TlEntry } from './types' import { writeTlEntryToString } from './stringify' @@ -7,7 +8,10 @@ export function computeConstructorIdFromString(line: string): number { CRC32.str( // normalize line - .replace(/[{};]|[a-zA-Z0-9_]+:flags\.[0-9]+\?true|#[0-9a-f]{1,8}/g, '') + .replace( + /[{};]|[a-zA-Z0-9_]+:flags\.[0-9]+\?true|#[0-9a-f]{1,8}/g, + '' + ) .replace(/[<>]/g, ' ') .replace(/ +/g, ' ') .replace(':bytes', ':string') diff --git a/packages/tl-utils/src/diff.ts b/packages/tl-utils/src/diff.ts index f4cec83a..8d6390a6 100644 --- a/packages/tl-utils/src/diff.ts +++ b/packages/tl-utils/src/diff.ts @@ -20,6 +20,13 @@ export function generateTlEntriesDifference( name: a.name, } + if (a.comment !== b.comment) { + diff.comment = { + old: a.comment, + new: b.comment, + } + } + if (a.id !== b.id) { let oldId = a.id let newId = b.id @@ -190,11 +197,7 @@ export function generateTlSchemasDifference( const entryDiff = generateTlEntriesDifference(entry, other) - if ( - entryDiff.id || - entryDiff.generics || - entryDiff.arguments - ) { + if (entryDiff.id || entryDiff.generics || entryDiff.arguments) { diff[kind].modified.push(entryDiff) } }) diff --git a/packages/tl-utils/src/merge.ts b/packages/tl-utils/src/merge.ts index 6c2827de..e24f83bb 100644 --- a/packages/tl-utils/src/merge.ts +++ b/packages/tl-utils/src/merge.ts @@ -1,4 +1,4 @@ -import { TlArgument, TlEntry, TlFullSchema } from './types' +import { TlEntry, TlFullSchema } from './types' import { computeConstructorIdFromEntry } from './ctor-id' export function mergeTlEntries(entries: TlEntry[]): TlEntry | string { @@ -25,7 +25,8 @@ export function mergeTlEntries(entries: TlEntry[]): TlEntry | string { if (arg.type === '#') { flagsLastIndex[arg.name] = idx - } if (arg.predicate) { + } + if (arg.predicate) { const flagsField = arg.predicate.split('.')[0] flagsLastIndex[flagsField] = idx } diff --git a/packages/tl-utils/src/parse.ts b/packages/tl-utils/src/parse.ts index f96d14b3..1c9b6043 100644 --- a/packages/tl-utils/src/parse.ts +++ b/packages/tl-utils/src/parse.ts @@ -2,7 +2,8 @@ import { computeConstructorIdFromString } from './ctor-id' import { TL_PRIMITIVES, TlEntry } from './types' import { parseTdlibStyleComment } from './utils' -const SINGLE_REGEX = /^(.+?)(?:#([0-9a-f]{1,8}))?(?: \?)?(?: {(.+?:.+?)})? ((?:.+? )*)= (.+);$/ +const SINGLE_REGEX = + /^(.+?)(?:#([0-9a-f]{1,8}))?(?: \?)?(?: {(.+?:.+?)})? ((?:.+? )*)= (.+);$/ function applyPrefix(prefix: string, type: string): string { if (type in TL_PRIMITIVES) return type @@ -46,12 +47,12 @@ export function parseTlToEntries( if (line.match(/^\/\//)) { if (currentComment) { if (line[2] === '-') { - currentComment += '\n' + line.substr(3).trim() + currentComment += '\n' + line.substring(3).trim() } else { - currentComment += ' ' + line.substr(2).trim() + currentComment += ' ' + line.substring(2).trim() } } else { - currentComment = line.substr(2).trim() + currentComment = line.substring(2).trim() } return diff --git a/packages/tl-utils/src/patch.ts b/packages/tl-utils/src/patch.ts index e43c0b00..03fbace7 100644 --- a/packages/tl-utils/src/patch.ts +++ b/packages/tl-utils/src/patch.ts @@ -1,4 +1,5 @@ import { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime' + import { parseTlToEntries } from './parse' import { generateReaderCodeForTlEntries } from './codegen/reader' import { generateWriterCodeForTlEntries } from './codegen/writer' diff --git a/packages/tl-utils/src/types.ts b/packages/tl-utils/src/types.ts index 23681825..a69ce0d9 100644 --- a/packages/tl-utils/src/types.ts +++ b/packages/tl-utils/src/types.ts @@ -83,6 +83,7 @@ export interface TlEntryDiff { id?: PropertyDiff generics?: PropertyDiff arguments?: BasicDiff + comment?: PropertyDiff } interface TlUnionDiff { @@ -113,5 +114,5 @@ export const TL_PRIMITIVES = { Bool: 1, true: 1, null: 1, - Object: true + Object: true, } as const diff --git a/packages/tl-utils/src/utils.ts b/packages/tl-utils/src/utils.ts index 3f7e6e87..0491e508 100644 --- a/packages/tl-utils/src/utils.ts +++ b/packages/tl-utils/src/utils.ts @@ -6,7 +6,6 @@ export function splitNameToNamespace(name: string): [string | null, string] { return [null, name] } - export function parseTdlibStyleComment(str: string): Record { const obj: Record = {} @@ -24,7 +23,9 @@ export function parseTdlibStyleComment(str: string): Record { return obj } -export function groupTlEntriesByNamespace(entries: TlEntry[]): Record { +export function groupTlEntriesByNamespace( + entries: TlEntry[] +): Record { const ret: Record = {} entries.forEach((entry) => { diff --git a/packages/tl-utils/tests/codegen/reader.spec.ts b/packages/tl-utils/tests/codegen/reader.spec.ts index 8911adc5..d0ac7364 100644 --- a/packages/tl-utils/tests/codegen/reader.spec.ts +++ b/packages/tl-utils/tests/codegen/reader.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { generateReaderCodeForTlEntry } from '../../src/codegen/reader' import { parseTlToEntries } from '../../src/parse' @@ -82,8 +83,8 @@ describe('generateReaderCodeForTlEntry', () => { 'return{', "_:'updates.channelDifferenceEmpty',", 'final:!!(flags&1),', - "pts:pts,", - "timeout:timeout,", + 'pts:pts,', + 'timeout:timeout,', 'canDeleteChannel:!!(flags2&1),', '}' ) diff --git a/packages/tl-utils/tests/codegen/types.spec.ts b/packages/tl-utils/tests/codegen/types.spec.ts index f025ec48..2a074dc0 100644 --- a/packages/tl-utils/tests/codegen/types.spec.ts +++ b/packages/tl-utils/tests/codegen/types.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { parseTlToEntries } from '../../src/parse' import { generateTypescriptDefinitionsForTlEntry, diff --git a/packages/tl-utils/tests/codegen/writer.spec.ts b/packages/tl-utils/tests/codegen/writer.spec.ts index f419fbe1..4f05110d 100644 --- a/packages/tl-utils/tests/codegen/writer.spec.ts +++ b/packages/tl-utils/tests/codegen/writer.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { parseTlToEntries } from '../../src/parse' import { generateWriterCodeForTlEntry } from '../../src/codegen/writer' diff --git a/packages/tl-utils/tests/ctor-id.spec.ts b/packages/tl-utils/tests/ctor-id.spec.ts index beab8241..74164de1 100644 --- a/packages/tl-utils/tests/ctor-id.spec.ts +++ b/packages/tl-utils/tests/ctor-id.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { computeConstructorIdFromEntry, computeConstructorIdFromString, @@ -155,7 +156,7 @@ describe('computeConstructorIdFromEntry', () => { 'flags:#', 'dark:flags.0?true', 'format:flags.1?string', - 'theme:flags.1?InputTheme', + 'theme:flags.1?InputTheme' ), 0x7ae43737 ) @@ -166,8 +167,8 @@ describe('computeConstructorIdFromEntry', () => { entry.generics = [ { name: 'X', - type: 'Type' - } + type: 'Type', + }, ] test(entry, 0xcb9f372d) }) diff --git a/packages/tl-utils/tests/diff.spec.ts b/packages/tl-utils/tests/diff.spec.ts index bd180d13..7d1b480b 100644 --- a/packages/tl-utils/tests/diff.spec.ts +++ b/packages/tl-utils/tests/diff.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { parseTlToEntries } from '../src/parse' import { TlEntryDiff, TlSchemaDiff } from '../src/types' import { @@ -212,7 +213,6 @@ describe('generateTlSchemasDifference', () => { arguments: [], }, ], - methods: [], }, ], added: [], @@ -240,7 +240,6 @@ describe('generateTlSchemasDifference', () => { arguments: [], }, ], - methods: [], }, ], removed: [], @@ -280,14 +279,14 @@ describe('generateTlSchemasDifference', () => { arguments: [], }, ], - modified: [] + modified: [], }, methods: { added: [], removed: [], - modified: [] - } - } + modified: [], + }, + }, ], }, } @@ -313,10 +312,11 @@ describe('generateTlSchemasDifference', () => { arguments: [ { name: 'foo', - type: 'Foo' - } + type: 'Foo', + }, ], - },{ + }, + { kind: 'class', name: 'test3', id: 704164487, @@ -333,8 +333,9 @@ describe('generateTlSchemasDifference', () => { arguments: [ { name: 'foo', - type: 'int' - }], + type: 'int', + }, + ], }, { kind: 'class', @@ -344,14 +345,14 @@ describe('generateTlSchemasDifference', () => { arguments: [], }, ], - modified: [] + modified: [], }, methods: { added: [], removed: [], - modified: [] - } - } + modified: [], + }, + }, ], }, } @@ -381,7 +382,6 @@ describe('generateTlSchemasDifference', () => { arguments: [], }, ], - methods: [], }, ], removed: [ @@ -403,7 +403,6 @@ describe('generateTlSchemasDifference', () => { arguments: [], }, ], - methods: [], }, ], modified: [], diff --git a/packages/tl-utils/tests/merge.spec.ts b/packages/tl-utils/tests/merge.spec.ts index 37c8db27..437ad703 100644 --- a/packages/tl-utils/tests/merge.spec.ts +++ b/packages/tl-utils/tests/merge.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { mergeTlEntries, mergeTlSchemas } from '../src/merge' import { parseTlToEntries } from '../src/parse' import { writeTlEntryToString } from '../src/stringify' @@ -81,7 +82,10 @@ describe('mergeTlSchemas', () => { ) expect( - writeTlEntriesToString(res.entries, { omitPrimitives: true, tdlibComments: true }) + writeTlEntriesToString(res.entries, { + omitPrimitives: true, + tdlibComments: true, + }) ).eq(expected.join('\n')) } diff --git a/packages/tl-utils/tests/parse.spec.ts b/packages/tl-utils/tests/parse.spec.ts index 6423b40b..20fd576f 100644 --- a/packages/tl-utils/tests/parse.spec.ts +++ b/packages/tl-utils/tests/parse.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { TlEntry } from '../src/types' import { parseTlToEntries } from '../src/parse' @@ -288,14 +289,14 @@ users.getUsers id:Vector = Vector; '//but multiline\n\n' + '//yet another at the end', { - onOrphanComment: (s) => orphaned.push(s) + onOrphanComment: (s) => orphaned.push(s), } ) expect(orphaned).eql([ 'some comment idk', 'another comment but multiline', - 'yet another at the end' + 'yet another at the end', ]) }) }) diff --git a/packages/tl-utils/tests/schema.spec.ts b/packages/tl-utils/tests/schema.spec.ts index 9c46a5e3..75f6b3af 100644 --- a/packages/tl-utils/tests/schema.spec.ts +++ b/packages/tl-utils/tests/schema.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { TlEntry } from '../src/types' import { writeTlEntriesToString } from '../src/schema' @@ -132,7 +133,7 @@ describe('writeTlEntriesToString', () => { } const method: TlEntry = { ...cls, - kind: 'method' + kind: 'method', } test( @@ -146,7 +147,7 @@ describe('writeTlEntriesToString', () => { '---functions---', 'error#c4b9f9bb code:int text:string = Error;', '---types---', - 'error#c4b9f9bb code:int text:string = Error;', + 'error#c4b9f9bb code:int text:string = Error;' ) }) }) diff --git a/packages/tl-utils/tests/stringify.spec.ts b/packages/tl-utils/tests/stringify.spec.ts index 43c4acc0..019d1f39 100644 --- a/packages/tl-utils/tests/stringify.spec.ts +++ b/packages/tl-utils/tests/stringify.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' + import { TlEntry } from '../src/types' import { writeTlEntryToString } from '../src/stringify' @@ -33,7 +34,10 @@ describe('writeTlEntryToString', () => { it('writes constructors without parameters', () => { test(make('auth.logOut', 'Bool'), 'auth.logOut = Bool;') - test(make('auth.resetAuthorizations', 'Bool'), 'auth.resetAuthorizations = Bool;') + test( + make('auth.resetAuthorizations', 'Bool'), + 'auth.resetAuthorizations = Bool;' + ) }) it('writes constructor id if available', () => { @@ -98,7 +102,7 @@ describe('writeTlEntryToString', () => { 'flags:#', 'dark:flags.0?true', 'format:flags.1?string', - 'theme:flags.1?InputTheme', + 'theme:flags.1?InputTheme' ), 'account.installTheme flags:# dark:flags.0?true format:flags.1?string theme:flags.1?InputTheme = Bool;' ) @@ -109,8 +113,8 @@ describe('writeTlEntryToString', () => { entry.generics = [ { name: 'X', - type: 'Type' - } + type: 'Type', + }, ] test(entry, 'invokeAfterMsg {X:Type} msg_id:long query:!X = X;') }) diff --git a/packages/tl/package.json b/packages/tl/package.json index 27c6fdc1..46d54045 100644 --- a/packages/tl/package.json +++ b/packages/tl/package.json @@ -6,7 +6,7 @@ "author": "Alisa Sireneva ", "license": "LGPL-3.0", "scripts": { - "test": "tsc --noEmit tests/types.ts", + "test": "tsc --noEmit --esModuleInterop tests/types.ts", "fetch-mtp": "node -r ts-node/register scripts/fetch-mtp.ts", "fetch-api": "node -r ts-node/register scripts/fetch-api.ts", "fetch-errors": "node -r ts-node/register scripts/fetch-errors.ts", diff --git a/packages/tl/scripts/constants.ts b/packages/tl/scripts/constants.ts index c917b736..516875f8 100644 --- a/packages/tl/scripts/constants.ts +++ b/packages/tl/scripts/constants.ts @@ -1,7 +1,10 @@ import { join } from 'path' export const DOC_CACHE_FILE = join(__dirname, '.documentation.cache.json') -export const DESCRIPTIONS_YAML_FILE = join(__dirname, '../data/descriptions.yaml') +export const DESCRIPTIONS_YAML_FILE = join( + __dirname, + '../data/descriptions.yaml' +) export const API_SCHEMA_JSON_FILE = join(__dirname, '../api-schema.json') export const MTP_SCHEMA_JSON_FILE = join(__dirname, '../mtp-schema.json') export const ERRORS_JSON_FILE = join(__dirname, '../raw-errors.json') diff --git a/packages/tl/scripts/process-descriptions-yaml.ts b/packages/tl/scripts/process-descriptions-yaml.ts index ec6bddb8..63f18912 100644 --- a/packages/tl/scripts/process-descriptions-yaml.ts +++ b/packages/tl/scripts/process-descriptions-yaml.ts @@ -1,7 +1,4 @@ -import { - CachedDocumentation, - CachedDocumentationEntry, -} from './documentation' +import { CachedDocumentation, CachedDocumentationEntry } from './documentation' type MaybeOverwrite = | string diff --git a/packages/tl/scripts/schema.ts b/packages/tl/scripts/schema.ts index 98fa71d3..56b5f079 100644 --- a/packages/tl/scripts/schema.ts +++ b/packages/tl/scripts/schema.ts @@ -21,11 +21,14 @@ export interface TlPackedSchema { u: Record } -export function packTlSchema(schema: TlFullSchema, layer: number): TlPackedSchema { +export function packTlSchema( + schema: TlFullSchema, + layer: number +): TlPackedSchema { const ret: TlPackedSchema = { l: layer, e: schema.entries, - u: {} + u: {}, } for (const name in schema.unions) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41413263..749dd8d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,9 +23,9 @@ importers: prettier: ^2.6.2 rimraf: ^3.0.2 semver: ^7.3.7 - ts-node: ^10.7.0 - typedoc: ^0.22.15 - typescript: ^4.6.4 + ts-node: ^10.8.1 + typedoc: ^0.23.2 + typescript: ^4.7.4 dependencies: node-gyp: 9.0.0 devDependencies: @@ -34,8 +34,8 @@ importers: '@types/node': 14.18.16 '@types/node-forge': 1.0.2 '@types/ws': 7.4.7 - '@typescript-eslint/eslint-plugin': 4.33.0_lzzr7k3tjtqil7aczuhmzzwame - '@typescript-eslint/parser': 4.33.0_e4zyhrvfnqudwdx5bevnvkluy4 + '@typescript-eslint/eslint-plugin': 4.33.0_3ekaj7j3owlolnuhj3ykrb7u7i + '@typescript-eslint/parser': 4.33.0_hxadhbs2xogijvk7vq4t2azzbu chai: 4.3.6 dotenv-flow: 3.2.0 eslint: 7.32.0 @@ -47,9 +47,9 @@ importers: prettier: 2.6.2 rimraf: 3.0.2 semver: 7.3.7 - ts-node: 10.7.0_mocf6w6juzjyi26vrxr4oqpfq4 - typedoc: 0.22.15_typescript@4.6.4 - typescript: 4.6.4 + ts-node: 10.8.1_n4ne3vfoqubxgiypogr36fpdje + typedoc: 0.23.2_typescript@4.7.4 + typescript: 4.7.4 packages/client: specifiers: @@ -467,16 +467,11 @@ packages: to-fast-properties: 2.0.0 dev: true - /@cspotcode/source-map-consumer/0.8.0: - resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} - engines: {node: '>= 12'} - dev: true - - /@cspotcode/source-map-support/0.7.0: - resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: - '@cspotcode/source-map-consumer': 0.8.0 + '@jridgewell/trace-mapping': 0.3.9 dev: true /@eslint/eslintrc/0.4.3: @@ -696,7 +691,7 @@ packages: '@types/node': 14.18.16 dev: true - /@typescript-eslint/eslint-plugin/4.33.0_lzzr7k3tjtqil7aczuhmzzwame: + /@typescript-eslint/eslint-plugin/4.33.0_3ekaj7j3owlolnuhj3ykrb7u7i: resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -707,8 +702,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.33.0_e4zyhrvfnqudwdx5bevnvkluy4 - '@typescript-eslint/parser': 4.33.0_e4zyhrvfnqudwdx5bevnvkluy4 + '@typescript-eslint/experimental-utils': 4.33.0_hxadhbs2xogijvk7vq4t2azzbu + '@typescript-eslint/parser': 4.33.0_hxadhbs2xogijvk7vq4t2azzbu '@typescript-eslint/scope-manager': 4.33.0 debug: 4.3.4 eslint: 7.32.0 @@ -716,13 +711,13 @@ packages: ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.6.4 - typescript: 4.6.4 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils/4.33.0_e4zyhrvfnqudwdx5bevnvkluy4: + /@typescript-eslint/experimental-utils/4.33.0_hxadhbs2xogijvk7vq4t2azzbu: resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -731,7 +726,7 @@ packages: '@types/json-schema': 7.0.11 '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.6.4 + '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.7.4 eslint: 7.32.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@7.32.0 @@ -740,7 +735,7 @@ packages: - typescript dev: true - /@typescript-eslint/parser/4.33.0_e4zyhrvfnqudwdx5bevnvkluy4: + /@typescript-eslint/parser/4.33.0_hxadhbs2xogijvk7vq4t2azzbu: resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -752,10 +747,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.6.4 + '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.7.4 debug: 4.3.4 eslint: 7.32.0 - typescript: 4.6.4 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true @@ -773,7 +768,7 @@ packages: engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/typescript-estree/4.33.0_typescript@4.6.4: + /@typescript-eslint/typescript-estree/4.33.0_typescript@4.7.4: resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -788,8 +783,8 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.6.4 - typescript: 4.6.4 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true @@ -2362,8 +2357,8 @@ packages: - supports-color dev: false - /marked/4.0.14: - resolution: {integrity: sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==} + /marked/4.0.17: + resolution: {integrity: sha512-Wfk0ATOK5iPxM4ptrORkFemqroz0ZDxp5MWfYA7H/F+wO17NRWV5Ypxi6p3g2Xmw2bKeiYOl6oVnLHKxBA0VhA==} engines: {node: '>= 12'} hasBin: true dev: true @@ -2416,6 +2411,13 @@ packages: dependencies: brace-expansion: 2.0.1 + /minimatch/5.1.0: + resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} @@ -3316,8 +3318,8 @@ packages: resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} dev: true - /ts-node/10.7.0_mocf6w6juzjyi26vrxr4oqpfq4: - resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} + /ts-node/10.8.1_n4ne3vfoqubxgiypogr36fpdje: + resolution: {integrity: sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -3330,7 +3332,7 @@ packages: '@swc/wasm': optional: true dependencies: - '@cspotcode/source-map-support': 0.7.0 + '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.8 '@tsconfig/node12': 1.0.9 '@tsconfig/node14': 1.0.1 @@ -3342,7 +3344,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.6.4 + typescript: 4.7.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -3355,14 +3357,14 @@ packages: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true - /tsutils/3.21.0_typescript@4.6.4: + /tsutils/3.21.0_typescript@4.7.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.6.4 + typescript: 4.7.4 dev: true /tunnel-agent/0.6.0: @@ -3399,23 +3401,22 @@ packages: is-typedarray: 1.0.0 dev: true - /typedoc/0.22.15_typescript@4.6.4: - resolution: {integrity: sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q==} - engines: {node: '>= 12.10.0'} + /typedoc/0.23.2_typescript@4.7.4: + resolution: {integrity: sha512-THpC4vtb3wu1yck6YHzEc4ck6W4lScf8TD0Rg7XAetDih8BzP+ErYO0/6DtdzYcZyKkDwEoujkMeWW7CffCbrQ==} + engines: {node: '>= 14.14'} hasBin: true peerDependencies: - typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x + typescript: 4.6.x || 4.7.x dependencies: - glob: 7.2.0 lunr: 2.3.9 - marked: 4.0.14 - minimatch: 5.0.1 + marked: 4.0.17 + minimatch: 5.1.0 shiki: 0.10.1 - typescript: 4.6.4 + typescript: 4.7.4 dev: true - /typescript/4.6.4: - resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} + /typescript/4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} engines: {node: '>=4.2.0'} hasBin: true dev: true diff --git a/scripts/publish.js b/scripts/publish.js index 9f43cb38..064220e2 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -115,10 +115,10 @@ function publishSinglePackage(name) { throw new Error('client.js exports.TelegramClient not found') jsContent = - jsContent.substr(0, idx) + + jsContent.substring(0, idx) + methods.join('\n') + '\n' + - jsContent.substr(idx) + jsContent.substring(idx) fs.writeFileSync(path.join(dir, 'dist/client.js'), jsContent) } diff --git a/tl-reference/scripts/prepare-data.js b/tl-reference/scripts/prepare-data.js index 5989d0c2..64d7f678 100644 --- a/tl-reference/scripts/prepare-data.js +++ b/tl-reference/scripts/prepare-data.js @@ -37,16 +37,16 @@ function convertToArrays(ns) { const marked = require('marked') const cheerio = require('cheerio') -const pascalToCamel = (s) => s[0].toLowerCase() + s.substr(1) +const pascalToCamel = (s) => s[0].toLowerCase() + s.substring(1) const camelToSnake = (str) => str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`) -const camelToPascal = (s) => s[0].toUpperCase() + s.substr(1) +const camelToPascal = (s) => s[0].toUpperCase() + s.substring(1) function renderDescription(description) { return marked( description.replace(/{@link (.+?)}/g, (_, name) => { if (name.startsWith('tl.')) { - let [ns, type] = name.substr(3).split('.') + let [ns, type] = name.substring(3).split('.') if (!type) { type = ns ns = undefined @@ -114,7 +114,7 @@ function prepareData(data) { } const fullTypeName = (type) => { if (type === 'X') return 'any' - if (type[0] === '%') type = type.substr(1) + if (type[0] === '%') type = type.substring(1) if (prefix_ === 'mt_' && type === 'Object') return 'tl.TlObject' if ( type === 'number' ||