diff --git a/packages/client/src/methods/chats/get-chat-members.ts b/packages/client/src/methods/chats/get-chat-members.ts index 1fb79510..1d0c9789 100644 --- a/packages/client/src/methods/chats/get-chat-members.ts +++ b/packages/client/src/methods/chats/get-chat-members.ts @@ -5,6 +5,7 @@ import { assertTypeIs } from '@mtcute/core/utils' import { TelegramClient } from '../../client' import { ArrayWithTotal, ChatMember, InputPeerLike, MtInvalidPeerTypeError, PeersIndex } from '../../types' +import { makeArrayWithTotal } from '../../utils' import { isInputPeerChannel, isInputPeerChat, normalizeToInputChannel } from '../../utils/peer-utils' /** @@ -131,9 +132,8 @@ export async function getChatMembers( const peers = PeersIndex.from(res) const ret = res.participants.map((i) => new ChatMember(this, i, peers)) as ArrayWithTotal - ret.total = res.count - return ret + return makeArrayWithTotal(ret, res.count) } throw new MtInvalidPeerTypeError(chatId, 'chat or channel') diff --git a/packages/client/src/types/auth/sent-code.ts b/packages/client/src/types/auth/sent-code.ts index f64d714b..14066706 100644 --- a/packages/client/src/types/auth/sent-code.ts +++ b/packages/client/src/types/auth/sent-code.ts @@ -1,6 +1,6 @@ import { tl } from '@mtcute/core' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' const sentCodeMap: Record = { 'auth.sentCodeTypeApp': 'app', diff --git a/packages/client/src/types/auth/terms-of-service.ts b/packages/client/src/types/auth/terms-of-service.ts index 72af441e..6fcd90ae 100644 --- a/packages/client/src/types/auth/terms-of-service.ts +++ b/packages/client/src/types/auth/terms-of-service.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { isPresent } from '@mtcute/core/utils' +import { makeInspectable } from '../../utils' import { MessageEntity } from '../messages' -import { makeInspectable } from '../utils' /** * Telegram's Terms of Service returned by {@link TelegramClient.signIn} diff --git a/packages/client/src/types/bots/callback-query.ts b/packages/client/src/types/bots/callback-query.ts index 7e20e22b..541ed9f3 100644 --- a/packages/client/src/types/bots/callback-query.ts +++ b/packages/client/src/types/bots/callback-query.ts @@ -1,11 +1,11 @@ import { BasicPeerType, getBasicPeerType, getMarkedPeerId, MtArgumentError, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { encodeInlineMessageId } from '../../utils/inline-utils' import { MtMessageNotFoundError } from '../errors' import { Message } from '../messages' import { PeersIndex, User } from '../peers' -import { makeInspectable } from '../utils' /** * An incoming callback query, originated from a callback button diff --git a/packages/client/src/types/bots/game-high-score.ts b/packages/client/src/types/bots/game-high-score.ts index b511913d..9e558728 100644 --- a/packages/client/src/types/bots/game-high-score.ts +++ b/packages/client/src/types/bots/game-high-score.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { PeersIndex, User } from '../peers' -import { makeInspectable } from '../utils' /** * Game high score diff --git a/packages/client/src/types/bots/inline-query.ts b/packages/client/src/types/bots/inline-query.ts index 2a4ef2b6..a34f52a5 100644 --- a/packages/client/src/types/bots/inline-query.ts +++ b/packages/client/src/types/bots/inline-query.ts @@ -1,9 +1,9 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { Location } from '../media' import { PeersIndex, PeerType, User } from '../peers' -import { makeInspectable } from '../utils' import { InputInlineResult } from './input' const PEER_TYPE_MAP: Record = { diff --git a/packages/client/src/types/files/file-location.ts b/packages/client/src/types/files/file-location.ts index 77591615..44a3501e 100644 --- a/packages/client/src/types/files/file-location.ts +++ b/packages/client/src/types/files/file-location.ts @@ -3,7 +3,7 @@ import { Readable } from 'stream' import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { FileDownloadParameters } from './utils' /** diff --git a/packages/client/src/types/files/web-document.ts b/packages/client/src/types/files/web-document.ts index 94b97d5c..01e477a6 100644 --- a/packages/client/src/types/files/web-document.ts +++ b/packages/client/src/types/files/web-document.ts @@ -1,7 +1,7 @@ import { MtArgumentError, tl } from '@mtcute/core' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { FileLocation } from './file-location' const STUB_LOCATION = () => { diff --git a/packages/client/src/types/index.ts b/packages/client/src/types/index.ts index 78f37860..aad3e9ac 100644 --- a/packages/client/src/types/index.ts +++ b/packages/client/src/types/index.ts @@ -10,4 +10,4 @@ export * from './misc' export * from './parser' export * from './peers' export * from './updates' -export { ArrayWithTotal, MaybeDynamic } from './utils' +export * from './utils' diff --git a/packages/client/src/types/media/audio.ts b/packages/client/src/types/media/audio.ts index afd13424..b9815572 100644 --- a/packages/client/src/types/media/audio.ts +++ b/packages/client/src/types/media/audio.ts @@ -2,7 +2,7 @@ import { tl } from '@mtcute/core' import { tdFileId } from '@mtcute/file-id' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { RawDocument } from './document' /** diff --git a/packages/client/src/types/media/contact.ts b/packages/client/src/types/media/contact.ts index 48737ca0..8c5ba9ee 100644 --- a/packages/client/src/types/media/contact.ts +++ b/packages/client/src/types/media/contact.ts @@ -1,6 +1,6 @@ import { tl } from '@mtcute/core' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' /** * A phone contact diff --git a/packages/client/src/types/media/dice.ts b/packages/client/src/types/media/dice.ts index 3e6cb6c6..298c420a 100644 --- a/packages/client/src/types/media/dice.ts +++ b/packages/client/src/types/media/dice.ts @@ -1,6 +1,6 @@ import { tl } from '@mtcute/core' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' /** * A dice or another interactive random emoji. diff --git a/packages/client/src/types/media/document.ts b/packages/client/src/types/media/document.ts index 52897e04..60fe66f1 100644 --- a/packages/client/src/types/media/document.ts +++ b/packages/client/src/types/media/document.ts @@ -2,8 +2,8 @@ import { tl } from '@mtcute/core' import { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { FileLocation } from '../files' -import { makeInspectable } from '../utils' import { Thumbnail } from './thumbnail' /** diff --git a/packages/client/src/types/media/game.ts b/packages/client/src/types/media/game.ts index e321eac6..047b23c0 100644 --- a/packages/client/src/types/media/game.ts +++ b/packages/client/src/types/media/game.ts @@ -1,7 +1,7 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { Photo } from './photo' import { Video } from './video' diff --git a/packages/client/src/types/media/invoice.ts b/packages/client/src/types/media/invoice.ts index 198094c5..c16b705e 100644 --- a/packages/client/src/types/media/invoice.ts +++ b/packages/client/src/types/media/invoice.ts @@ -1,9 +1,9 @@ import { MtArgumentError, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { WebDocument } from '../files/web-document' import { _messageMediaFromTl, MessageMedia } from '../messages' -import { makeInspectable } from '../utils' import { Thumbnail } from './thumbnail' /** diff --git a/packages/client/src/types/media/location.ts b/packages/client/src/types/media/location.ts index 81ed528f..6a03871c 100644 --- a/packages/client/src/types/media/location.ts +++ b/packages/client/src/types/media/location.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { FileLocation } from '../files' -import { makeInspectable } from '../utils' /** * A point on the map diff --git a/packages/client/src/types/media/photo.ts b/packages/client/src/types/media/photo.ts index 472850d5..76e0fbac 100644 --- a/packages/client/src/types/media/photo.ts +++ b/packages/client/src/types/media/photo.ts @@ -1,8 +1,8 @@ import { MtArgumentError, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { FileLocation } from '../files' -import { makeInspectable } from '../utils' import { Thumbnail } from './thumbnail' /** diff --git a/packages/client/src/types/media/poll.ts b/packages/client/src/types/media/poll.ts index ae5a4d80..b77c096b 100644 --- a/packages/client/src/types/media/poll.ts +++ b/packages/client/src/types/media/poll.ts @@ -3,9 +3,9 @@ import Long from 'long' import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { MessageEntity } from '../messages' import { PeersIndex } from '../peers' -import { makeInspectable } from '../utils' export interface PollAnswer { /** diff --git a/packages/client/src/types/media/sticker.ts b/packages/client/src/types/media/sticker.ts index 9e25f814..8a8dbeae 100644 --- a/packages/client/src/types/media/sticker.ts +++ b/packages/client/src/types/media/sticker.ts @@ -2,8 +2,8 @@ import { MtArgumentError, tl } from '@mtcute/core' import { tdFileId } from '@mtcute/file-id' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { StickerSet } from '../misc' -import { makeInspectable } from '../utils' import { RawDocument } from './document' export interface MaskPosition { diff --git a/packages/client/src/types/media/thumbnail.ts b/packages/client/src/types/media/thumbnail.ts index 5dc21921..ce0a4e07 100644 --- a/packages/client/src/types/media/thumbnail.ts +++ b/packages/client/src/types/media/thumbnail.ts @@ -5,9 +5,9 @@ import { assertTypeIs } from '@mtcute/core/utils' import { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { inflateSvgPath, strippedPhotoToJpg, svgPathToFile } from '../../utils/file-utils' import { FileLocation } from '../files' -import { makeInspectable } from '../utils' /** * One size of some thumbnail diff --git a/packages/client/src/types/media/venue.ts b/packages/client/src/types/media/venue.ts index cb92f47e..724afa21 100644 --- a/packages/client/src/types/media/venue.ts +++ b/packages/client/src/types/media/venue.ts @@ -2,7 +2,7 @@ import { tl } from '@mtcute/core' import { assertTypeIs } from '@mtcute/core/utils' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { Location } from './location' export interface VenueSource { diff --git a/packages/client/src/types/media/video.ts b/packages/client/src/types/media/video.ts index 2252a10d..ad2151e1 100644 --- a/packages/client/src/types/media/video.ts +++ b/packages/client/src/types/media/video.ts @@ -2,7 +2,7 @@ import { tl } from '@mtcute/core' import { tdFileId } from '@mtcute/file-id' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { RawDocument } from './document' /** diff --git a/packages/client/src/types/media/voice.ts b/packages/client/src/types/media/voice.ts index 2ff6e7ab..d9fb6620 100644 --- a/packages/client/src/types/media/voice.ts +++ b/packages/client/src/types/media/voice.ts @@ -2,8 +2,8 @@ import { tl } from '@mtcute/core' import { tdFileId } from '@mtcute/file-id' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { decodeWaveform } from '../../utils/voice-utils' -import { makeInspectable } from '../utils' import { RawDocument } from './document' /** diff --git a/packages/client/src/types/media/web-page.ts b/packages/client/src/types/media/web-page.ts index d9499283..ab84ca8e 100644 --- a/packages/client/src/types/media/web-page.ts +++ b/packages/client/src/types/media/web-page.ts @@ -1,7 +1,7 @@ import { MtArgumentError, tl } from '@mtcute/core' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { RawDocument } from './document' import { parseDocument } from './document-utils' import { Photo } from './photo' diff --git a/packages/client/src/types/messages/dialog.ts b/packages/client/src/types/messages/dialog.ts index b2f952b7..fd45e713 100644 --- a/packages/client/src/types/messages/dialog.ts +++ b/packages/client/src/types/messages/dialog.ts @@ -1,9 +1,9 @@ import { getMarkedPeerId, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { MtMessageNotFoundError } from '../errors' import { Chat, PeersIndex } from '../peers' -import { makeInspectable } from '../utils' import { DraftMessage } from './draft-message' import { Message } from './message' diff --git a/packages/client/src/types/messages/draft-message.ts b/packages/client/src/types/messages/draft-message.ts index c86f5ca0..0f0127d7 100644 --- a/packages/client/src/types/messages/draft-message.ts +++ b/packages/client/src/types/messages/draft-message.ts @@ -1,9 +1,9 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { InputMediaLike } from '../media' import { InputPeerLike } from '../peers' -import { makeInspectable } from '../utils' import { Message } from './message' import { MessageEntity } from './message-entity' diff --git a/packages/client/src/types/messages/message-entity.ts b/packages/client/src/types/messages/message-entity.ts index 3fcb7587..aba1ab52 100644 --- a/packages/client/src/types/messages/message-entity.ts +++ b/packages/client/src/types/messages/message-entity.ts @@ -1,6 +1,6 @@ import { tl } from '@mtcute/core' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' const entityToType: Partial> = { messageEntityBlockquote: 'blockquote', diff --git a/packages/client/src/types/messages/message.ts b/packages/client/src/types/messages/message.ts index 63bee8d4..28500c5a 100644 --- a/packages/client/src/types/messages/message.ts +++ b/packages/client/src/types/messages/message.ts @@ -9,11 +9,11 @@ import { import { assertTypeIsNot } from '@mtcute/core/utils' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { BotKeyboard, ReplyMarkup } from '../bots' import { InputMediaLike, Sticker, WebPage } from '../media' import { FormattedString } from '../parser' import { Chat, InputPeerLike, PeersIndex, User } from '../peers' -import { makeInspectable } from '../utils' import { _messageActionFromTl, MessageAction } from './message-action' import { MessageEntity } from './message-entity' import { _messageMediaFromTl, MessageMedia } from './message-media' diff --git a/packages/client/src/types/messages/reactions.ts b/packages/client/src/types/messages/reactions.ts index d64291c7..8fb81c60 100644 --- a/packages/client/src/types/messages/reactions.ts +++ b/packages/client/src/types/messages/reactions.ts @@ -2,8 +2,8 @@ import { getMarkedPeerId, tl } from '@mtcute/core' import { assertTypeIs } from '@mtcute/core/utils' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { PeersIndex, User } from '../peers' -import { makeInspectable } from '../utils' export class PeerReaction { constructor( diff --git a/packages/client/src/types/misc/sticker-set.ts b/packages/client/src/types/misc/sticker-set.ts index 4976d231..df3619e5 100644 --- a/packages/client/src/types/misc/sticker-set.ts +++ b/packages/client/src/types/misc/sticker-set.ts @@ -2,11 +2,11 @@ import { MtTypeAssertionError, tl } from '@mtcute/core' import { LongMap } from '@mtcute/core/utils' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { MtEmptyError } from '../errors' import { InputFileLike } from '../files' import { MaskPosition, Sticker, StickerSourceType, StickerType, Thumbnail } from '../media' import { parseDocument } from '../media/document-utils' -import { makeInspectable } from '../utils' /** * Information about one sticker inside the set diff --git a/packages/client/src/types/misc/takeout-session.ts b/packages/client/src/types/misc/takeout-session.ts index 63ec6b6d..e380cc01 100644 --- a/packages/client/src/types/misc/takeout-session.ts +++ b/packages/client/src/types/misc/takeout-session.ts @@ -1,7 +1,7 @@ import { MustEqual, RpcCallOptions, tl } from '@mtcute/core' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' /** * Account takeout session diff --git a/packages/client/src/types/peers/chat-event.ts b/packages/client/src/types/peers/chat-event.ts index 5b4d8e87..2087d480 100644 --- a/packages/client/src/types/peers/chat-event.ts +++ b/packages/client/src/types/peers/chat-event.ts @@ -1,9 +1,9 @@ import { tl, toggleChannelIdMark } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { Photo } from '../media' import { Message } from '../messages' -import { makeInspectable } from '../utils' import { ChatInviteLink } from './chat-invite-link' import { ChatLocation } from './chat-location' import { ChatMember } from './chat-member' diff --git a/packages/client/src/types/peers/chat-invite-link.ts b/packages/client/src/types/peers/chat-invite-link.ts index 96e4ece6..9c7a5b5b 100644 --- a/packages/client/src/types/peers/chat-invite-link.ts +++ b/packages/client/src/types/peers/chat-invite-link.ts @@ -2,7 +2,7 @@ import { tl } from '@mtcute/core' import { assertTypeIsNot } from '@mtcute/core/utils' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { PeersIndex } from './index' import { User } from './user' diff --git a/packages/client/src/types/peers/chat-location.ts b/packages/client/src/types/peers/chat-location.ts index 2289716e..678c7bed 100644 --- a/packages/client/src/types/peers/chat-location.ts +++ b/packages/client/src/types/peers/chat-location.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { Location } from '../media' -import { makeInspectable } from '../utils' /** * Geolocation of a supergroup diff --git a/packages/client/src/types/peers/chat-member.ts b/packages/client/src/types/peers/chat-member.ts index 55544e65..dc831206 100644 --- a/packages/client/src/types/peers/chat-member.ts +++ b/packages/client/src/types/peers/chat-member.ts @@ -2,7 +2,7 @@ import { tl } from '@mtcute/core' import { assertTypeIs } from '@mtcute/core/utils' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' import { ChatPermissions } from './chat-permissions' import { PeersIndex } from './index' import { User } from './user' diff --git a/packages/client/src/types/peers/chat-permissions.ts b/packages/client/src/types/peers/chat-permissions.ts index 9261b99b..a74f063b 100644 --- a/packages/client/src/types/peers/chat-permissions.ts +++ b/packages/client/src/types/peers/chat-permissions.ts @@ -1,6 +1,6 @@ import { tl } from '@mtcute/core' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' /** * Represents the permissions of a user in a {@link Chat}. diff --git a/packages/client/src/types/peers/chat-photo.ts b/packages/client/src/types/peers/chat-photo.ts index 3f5cc306..c21302b0 100644 --- a/packages/client/src/types/peers/chat-photo.ts +++ b/packages/client/src/types/peers/chat-photo.ts @@ -4,9 +4,9 @@ import { MtArgumentError, tl, toggleChannelIdMark } from '@mtcute/core' import { tdFileId, toFileId, toUniqueFileId } from '@mtcute/file-id' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { strippedPhotoToJpg } from '../../utils/file-utils' import { FileLocation } from '../files' -import { makeInspectable } from '../utils' /** * A size of a chat photo diff --git a/packages/client/src/types/peers/chat-preview.ts b/packages/client/src/types/peers/chat-preview.ts index 4df993bd..0bcadbbf 100644 --- a/packages/client/src/types/peers/chat-preview.ts +++ b/packages/client/src/types/peers/chat-preview.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { Photo } from '../media' -import { makeInspectable } from '../utils' import { Chat } from './chat' import { User } from './user' diff --git a/packages/client/src/types/peers/chat.ts b/packages/client/src/types/peers/chat.ts index d37c0ad4..c8afbca7 100644 --- a/packages/client/src/types/peers/chat.ts +++ b/packages/client/src/types/peers/chat.ts @@ -1,9 +1,9 @@ import { getMarkedPeerId, MaybeArray, MtArgumentError, MtTypeAssertionError, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { InputMediaLike } from '../media' import { FormattedString } from '../parser' -import { makeInspectable } from '../utils' import { ChatLocation } from './chat-location' import { ChatPermissions } from './chat-permissions' import { ChatPhoto } from './chat-photo' diff --git a/packages/client/src/types/peers/user.ts b/packages/client/src/types/peers/user.ts index b0037cae..e47157a1 100644 --- a/packages/client/src/types/peers/user.ts +++ b/packages/client/src/types/peers/user.ts @@ -2,9 +2,9 @@ import { MtArgumentError, tl } from '@mtcute/core' import { assertTypeIs } from '@mtcute/core/utils' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { InputMediaLike } from '../media' import { FormattedString } from '../parser' -import { makeInspectable } from '../utils' import { ChatPhoto } from './chat-photo' /** 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 486462b1..b3b3222c 100644 --- a/packages/client/src/types/updates/bot-chat-join-request.ts +++ b/packages/client/src/types/updates/bot-chat-join-request.ts @@ -1,8 +1,8 @@ import { getBarePeerId, getMarkedPeerId, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { Chat, ChatInviteLink, PeersIndex, User } from '../peers' -import { makeInspectable } from '../utils' /** * This update is sent when a user requests to join a chat diff --git a/packages/client/src/types/updates/bot-stopped.ts b/packages/client/src/types/updates/bot-stopped.ts index e248029b..2baf7c7e 100644 --- a/packages/client/src/types/updates/bot-stopped.ts +++ b/packages/client/src/types/updates/bot-stopped.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { PeersIndex, User } from '../peers' -import { makeInspectable } from '../utils' /** * A user has stopped or restarted the bot. diff --git a/packages/client/src/types/updates/chat-join-request.ts b/packages/client/src/types/updates/chat-join-request.ts index 0a47b7e0..c01db74b 100644 --- a/packages/client/src/types/updates/chat-join-request.ts +++ b/packages/client/src/types/updates/chat-join-request.ts @@ -1,8 +1,8 @@ import { getBarePeerId, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { ChatInviteLinkJoinedMember, PeersIndex, User } from '../peers' -import { makeInspectable } from '../utils' /** * This update is sent when a user requests to join a chat diff --git a/packages/client/src/types/updates/chat-member-update.ts b/packages/client/src/types/updates/chat-member-update.ts index f0425de4..64b1f4ea 100644 --- a/packages/client/src/types/updates/chat-member-update.ts +++ b/packages/client/src/types/updates/chat-member-update.ts @@ -3,8 +3,8 @@ import { getMarkedPeerId, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { Chat, ChatInviteLink, ChatMember, PeersIndex, User } from '../' -import { makeInspectable } from '../utils' // todo: check case when restricted user joins chat - MTQ-35 /** diff --git a/packages/client/src/types/updates/chosen-inline-result.ts b/packages/client/src/types/updates/chosen-inline-result.ts index 273257e5..db215201 100644 --- a/packages/client/src/types/updates/chosen-inline-result.ts +++ b/packages/client/src/types/updates/chosen-inline-result.ts @@ -1,9 +1,9 @@ import { MtArgumentError, tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { encodeInlineMessageId } from '../../utils/inline-utils' import { Location, PeersIndex, User } from '../' -import { makeInspectable } from '../utils' /** * An inline result was chosen by the user and sent to some chat diff --git a/packages/client/src/types/updates/delete-message-update.ts b/packages/client/src/types/updates/delete-message-update.ts index 3db58c02..59abcd2a 100644 --- a/packages/client/src/types/updates/delete-message-update.ts +++ b/packages/client/src/types/updates/delete-message-update.ts @@ -1,7 +1,7 @@ import { tl, toggleChannelIdMark } from '@mtcute/core' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' /** * One or more messages 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 593f2523..92707e93 100644 --- a/packages/client/src/types/updates/history-read-update.ts +++ b/packages/client/src/types/updates/history-read-update.ts @@ -1,7 +1,7 @@ import { getMarkedPeerId, tl, toggleChannelIdMark } from '@mtcute/core' import { TelegramClient } from '../../client' -import { makeInspectable } from '../utils' +import { makeInspectable } from '../../utils' export class HistoryReadUpdate { constructor( diff --git a/packages/client/src/types/updates/poll-update.ts b/packages/client/src/types/updates/poll-update.ts index f71585f3..0924bf8c 100644 --- a/packages/client/src/types/updates/poll-update.ts +++ b/packages/client/src/types/updates/poll-update.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { PeersIndex, Poll } from '../' -import { makeInspectable } from '../utils' /** * Poll state has changed (stopped, somebody diff --git a/packages/client/src/types/updates/poll-vote.ts b/packages/client/src/types/updates/poll-vote.ts index ad7e62dd..97e9d84f 100644 --- a/packages/client/src/types/updates/poll-vote.ts +++ b/packages/client/src/types/updates/poll-vote.ts @@ -2,8 +2,8 @@ import { MtUnsupportedError, tl } from '@mtcute/core' import { assertTypeIs } from '@mtcute/core/utils' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { Chat, PeersIndex, User } from '../' -import { makeInspectable } from '../utils' /** * Some user has voted in a public poll. diff --git a/packages/client/src/types/updates/pre-checkout-query.ts b/packages/client/src/types/updates/pre-checkout-query.ts index 64ae223f..981b0cb6 100644 --- a/packages/client/src/types/updates/pre-checkout-query.ts +++ b/packages/client/src/types/updates/pre-checkout-query.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { PeersIndex, User } from '../peers' -import { makeInspectable } from '../utils' export class PreCheckoutQuery { constructor( diff --git a/packages/client/src/types/updates/user-status-update.ts b/packages/client/src/types/updates/user-status-update.ts index f94edc92..82c1d306 100644 --- a/packages/client/src/types/updates/user-status-update.ts +++ b/packages/client/src/types/updates/user-status-update.ts @@ -1,8 +1,8 @@ import { tl } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { User, UserParsedStatus, UserStatus } from '../' -import { makeInspectable } from '../utils' /** * User status has changed diff --git a/packages/client/src/types/updates/user-typing-update.ts b/packages/client/src/types/updates/user-typing-update.ts index 285acc38..b411e514 100644 --- a/packages/client/src/types/updates/user-typing-update.ts +++ b/packages/client/src/types/updates/user-typing-update.ts @@ -1,8 +1,8 @@ import { BasicPeerType, getBarePeerId, MtUnsupportedError, tl, toggleChannelIdMark } from '@mtcute/core' import { TelegramClient } from '../../client' +import { makeInspectable } from '../../utils' import { Chat, TypingStatus, User } from '../' -import { makeInspectable } from '../utils' /** * User's typing status has changed. diff --git a/packages/client/src/types/utils.ts b/packages/client/src/types/utils.ts index 5b0991a0..96c8248f 100644 --- a/packages/client/src/types/utils.ts +++ b/packages/client/src/types/utils.ts @@ -1,85 +1,5 @@ -/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-argument */ import { MaybeAsync } from '@mtcute/core' export type MaybeDynamic = MaybeAsync | (() => MaybeAsync) export type ArrayWithTotal = T[] & { total: number } - -let util: typeof import('util') | null = null - -try { - util = require('util') as typeof import('util') -} catch (e) {} - -// get all property names. unlike Object.getOwnPropertyNames, -// also gets inherited property names -function getAllGettersNames(obj: object): string[] { - const getters: string[] = [] - - do { - Object.getOwnPropertyNames(obj).forEach((prop) => { - if (prop !== '__proto__' && Object.getOwnPropertyDescriptor(obj, prop)?.get && !getters.includes(prop)) { - getters.push(prop) - } - }) - } while ((obj = Object.getPrototypeOf(obj))) - - return getters -} - -const bufferToJsonOriginal = Buffer.prototype.toJSON - -const bufferToJsonInspect = function (this: Buffer) { - return this.toString('base64') -} - -/** - * Small helper function that adds `toJSON` and `util.custom.inspect` - * methods to a given class based on its getters - * - * > **Note**: This means that all getters must be pure! - * > (getter that caches after its first invocation is also - * > considered pure in this case) - */ -export function makeInspectable(obj: new (...args: any[]) => any, props?: string[], hide?: string[]): void { - const getters: string[] = props ? props : [] - - for (const key of getAllGettersNames(obj.prototype)) { - if (!hide || !hide.includes(key)) getters.push(key) - } - - // dirty hack to set name for inspect result - // eslint-disable-next-line @typescript-eslint/no-implied-eval - const proto = new Function(`return function ${obj.name}(){}`)().prototype - - obj.prototype.toJSON = function (nested = false) { - if (!nested) { - (Buffer as any).toJSON = bufferToJsonInspect - } - - const ret: any = Object.create(proto) - getters.forEach((it) => { - try { - let val = this[it] - - if (val && typeof val === 'object' && typeof val.toJSON === 'function') { - val = val.toJSON(true) - } - ret[it] = val - } catch (e: any) { - ret[it] = 'Error: ' + e.message - } - }) - - if (!nested) { - Buffer.prototype.toJSON = bufferToJsonOriginal - } - - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return ret - } - if (util) { - obj.prototype[util.inspect.custom] = obj.prototype.toJSON - } -} diff --git a/packages/client/src/utils/index.ts b/packages/client/src/utils/index.ts index 54909ddc..cefb0c04 100644 --- a/packages/client/src/utils/index.ts +++ b/packages/client/src/utils/index.ts @@ -1,5 +1,6 @@ export * from './file-utils' export * from './inline-utils' +export * from './inspectable' export * from './misc-utils' export * from './peer-utils' export * from './rps-meter' diff --git a/packages/client/src/utils/inspectable.ts b/packages/client/src/utils/inspectable.ts new file mode 100644 index 00000000..dc48d192 --- /dev/null +++ b/packages/client/src/utils/inspectable.ts @@ -0,0 +1,80 @@ +/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-argument */ + +let util: typeof import('util') | null = null + +try { + util = require('util') as typeof import('util') +} catch (e) {} + +// get all property names. unlike Object.getOwnPropertyNames, +// also gets inherited property names +function getAllGettersNames(obj: object): string[] { + const getters: string[] = [] + + do { + Object.getOwnPropertyNames(obj).forEach((prop) => { + if (prop !== '__proto__' && Object.getOwnPropertyDescriptor(obj, prop)?.get && !getters.includes(prop)) { + getters.push(prop) + } + }) + } while ((obj = Object.getPrototypeOf(obj))) + + return getters +} + +const bufferToJsonOriginal = Buffer.prototype.toJSON + +const bufferToJsonInspect = function (this: Buffer) { + return this.toString('base64') +} + +/** + * Small helper function that adds `toJSON` and `util.custom.inspect` + * methods to a given class based on its getters + * + * > **Note**: This means that all getters must be pure! + * > (getter that caches after its first invocation is also + * > considered pure in this case) + */ +export function makeInspectable(obj: new (...args: any[]) => any, props?: string[], hide?: string[]): void { + const getters: string[] = props ? props : [] + + for (const key of getAllGettersNames(obj.prototype)) { + if (!hide || !hide.includes(key)) getters.push(key) + } + + // dirty hack to set name for inspect result + // eslint-disable-next-line @typescript-eslint/no-implied-eval + const proto = new Function(`return function ${obj.name}(){}`)().prototype + + obj.prototype.toJSON = function (nested = false) { + if (!nested) { + (Buffer as any).toJSON = bufferToJsonInspect + } + + const ret: any = Object.create(proto) + getters.forEach((it) => { + try { + let val = this[it] + + if (val && typeof val === 'object' && typeof val.toJSON === 'function') { + val = val.toJSON(true) + } + ret[it] = val + } catch (e: any) { + ret[it] = 'Error: ' + e.message + } + }) + + if (!nested) { + Buffer.prototype.toJSON = bufferToJsonOriginal + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return ret + } + if (util) { + obj.prototype[util.inspect.custom] = obj.prototype.toJSON + } +} diff --git a/packages/client/src/utils/misc-utils.ts b/packages/client/src/utils/misc-utils.ts index 0c27becc..e3af8e0b 100644 --- a/packages/client/src/utils/misc-utils.ts +++ b/packages/client/src/utils/misc-utils.ts @@ -1,6 +1,6 @@ import { MtArgumentError, tl } from '@mtcute/core' -import { MaybeDynamic, Message } from '../types' +import { ArrayWithTotal, MaybeDynamic, Message } from '../types' /** * Normalize phone number by stripping formatting @@ -17,6 +17,17 @@ export async function resolveMaybeDynamic(val: MaybeDynamic): Promise { return val instanceof Function ? await val() : await val } +export function makeArrayWithTotal(arr: T[], total: number): ArrayWithTotal { + Object.defineProperty(arr, 'total', { + value: total, + enumerable: false, + configurable: false, + writable: false, + }) + + return arr as ArrayWithTotal +} + export function extractChannelIdFromUpdate(upd: tl.TypeUpdate): number | undefined { // holy shit let res = 0