@mtcute/core 0.16.3 → 0.16.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -44,6 +44,10 @@ async function findDialogs(client, peers) {
44
44
  foundInputPeers.push(resolvedPeer);
45
45
  foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i);
46
46
  }
47
+ if (foundInputPeers.length === 0) {
48
+ // we didn't find anything, we can't even fetch the dialogs
49
+ throw new errors_js_1.MtPeerNotFoundError(`Could not find dialogs with peers: ${peers.join(', ')}`);
50
+ }
47
51
  const dialogs = await (0, get_peer_dialogs_js_1.getPeerDialogs)(client, foundInputPeers);
48
52
  if (foundInputPeers.length === peers.length) {
49
53
  return dialogs;
@@ -1 +1 @@
1
- {"version":3,"file":"find-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/find-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MaybeArray } from '../../../types/utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { Dialog } from '../../types/messages/dialog.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\nimport { getPeerDialogs } from './get-peer-dialogs.js'\nimport { iterDialogs } from './iter-dialogs.js'\n\n// @available=user\n/**\n * Try to find a dialog (dialogs) with a given peer (peers) by their ID, username or phone number.\n *\n * This might be an expensive call, as it will potentially iterate over all\n * dialogs to find the one with the given peer\n *\n * @throws {MtPeerNotFoundError} If a dialog with any of the given peers was not found\n */\nexport async function findDialogs(client: ITelegramClient, peers: MaybeArray<string | number>): Promise<Dialog[]> {\n if (!Array.isArray(peers)) peers = [peers]\n const resolved = await resolvePeerMany(client, peers)\n\n // now we need to split `peers` into two parts: ids that we could resolve and those we couldn't\n // those that we couldn't we'll iterate over all dialogs and try to find them by username/id\n // those that we could we'll use getPeerDialogs\n\n // id -> idx\n const notFoundIds = new Map<number, number>()\n // username -> idx\n const notFoundUsernames = new Map<string, number>()\n let notFoundCount = 0\n\n const foundInputPeers: tl.TypeInputPeer[] = []\n const foundIdxToOriginalIdx = new Map<number, number>()\n\n for (let i = 0; i < peers.length; i++) {\n const input = peers[i]\n const resolvedPeer = resolved[i]\n\n if (!resolvedPeer) {\n if (typeof input === 'number') {\n notFoundIds.set(input, i)\n } else {\n notFoundUsernames.set(input, i)\n }\n\n notFoundCount += 1\n\n continue\n }\n\n foundInputPeers.push(resolvedPeer)\n foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i)\n }\n\n const dialogs = await getPeerDialogs(client, foundInputPeers)\n\n if (foundInputPeers.length === peers.length) {\n return dialogs\n }\n\n const ret = new Array<Dialog>(peers.length)\n\n // populate found dialogs\n for (const [idx, origIdx] of foundIdxToOriginalIdx) {\n ret[origIdx] = dialogs[idx]\n }\n\n // now we need to iterate over all dialogs and try to find the rest\n for await (const dialog of iterDialogs(client, {\n archived: 'keep',\n })) {\n const chat = dialog.chat\n\n const idxById = notFoundIds.get(chat.id)\n\n if (idxById !== undefined) {\n ret[idxById] = dialog\n notFoundIds.delete(chat.id)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n\n if (!chat.username) continue\n\n const idxByUsername = notFoundUsernames.get(chat.username)\n\n if (idxByUsername !== undefined) {\n ret[idxByUsername] = dialog\n notFoundUsernames.delete(chat.username)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n }\n\n // if we still have some dialogs that we couldn't find, fail\n\n if (notFoundCount > 0) {\n const notFound = [...notFoundIds.keys(), ...notFoundUsernames.keys()]\n throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${notFound.join(', ')}`)\n }\n\n return ret\n}\n"]}
1
+ {"version":3,"file":"find-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/find-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MaybeArray } from '../../../types/utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { Dialog } from '../../types/messages/dialog.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\nimport { getPeerDialogs } from './get-peer-dialogs.js'\nimport { iterDialogs } from './iter-dialogs.js'\n\n// @available=user\n/**\n * Try to find a dialog (dialogs) with a given peer (peers) by their ID, username or phone number.\n *\n * This might be an expensive call, as it will potentially iterate over all\n * dialogs to find the one with the given peer\n *\n * @throws {MtPeerNotFoundError} If a dialog with any of the given peers was not found\n */\nexport async function findDialogs(client: ITelegramClient, peers: MaybeArray<string | number>): Promise<Dialog[]> {\n if (!Array.isArray(peers)) peers = [peers]\n const resolved = await resolvePeerMany(client, peers)\n\n // now we need to split `peers` into two parts: ids that we could resolve and those we couldn't\n // those that we couldn't we'll iterate over all dialogs and try to find them by username/id\n // those that we could we'll use getPeerDialogs\n\n // id -> idx\n const notFoundIds = new Map<number, number>()\n // username -> idx\n const notFoundUsernames = new Map<string, number>()\n let notFoundCount = 0\n\n const foundInputPeers: tl.TypeInputPeer[] = []\n const foundIdxToOriginalIdx = new Map<number, number>()\n\n for (let i = 0; i < peers.length; i++) {\n const input = peers[i]\n const resolvedPeer = resolved[i]\n\n if (!resolvedPeer) {\n if (typeof input === 'number') {\n notFoundIds.set(input, i)\n } else {\n notFoundUsernames.set(input, i)\n }\n\n notFoundCount += 1\n\n continue\n }\n\n foundInputPeers.push(resolvedPeer)\n foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i)\n }\n\n if (foundInputPeers.length === 0) {\n // we didn't find anything, we can't even fetch the dialogs\n throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${peers.join(', ')}`)\n }\n\n const dialogs = await getPeerDialogs(client, foundInputPeers)\n\n if (foundInputPeers.length === peers.length) {\n return dialogs\n }\n\n const ret = new Array<Dialog>(peers.length)\n\n // populate found dialogs\n for (const [idx, origIdx] of foundIdxToOriginalIdx) {\n ret[origIdx] = dialogs[idx]\n }\n\n // now we need to iterate over all dialogs and try to find the rest\n for await (const dialog of iterDialogs(client, {\n archived: 'keep',\n })) {\n const chat = dialog.chat\n\n const idxById = notFoundIds.get(chat.id)\n\n if (idxById !== undefined) {\n ret[idxById] = dialog\n notFoundIds.delete(chat.id)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n\n if (!chat.username) continue\n\n const idxByUsername = notFoundUsernames.get(chat.username)\n\n if (idxByUsername !== undefined) {\n ret[idxByUsername] = dialog\n notFoundUsernames.delete(chat.username)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n }\n\n // if we still have some dialogs that we couldn't find, fail\n\n if (notFoundCount > 0) {\n const notFound = [...notFoundIds.keys(), ...notFoundUsernames.keys()]\n throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${notFound.join(', ')}`)\n }\n\n return ret\n}\n"]}
@@ -68,11 +68,23 @@ class Thumbnail extends index_js_2.FileLocation {
68
68
  width = height = NaN;
69
69
  size = location.length;
70
70
  break;
71
- case 'photoPathSize': // lazily
72
- location = () => (0, file_utils_js_1.svgPathToFile)(this._path);
73
- width = height = NaN;
71
+ case 'photoPathSize': {
72
+ // try to find documentAttributeImageSize
73
+ const imageSize = media._ === 'document' ?
74
+ media.attributes.find((it) => it._ === 'documentAttributeImageSize') :
75
+ undefined;
76
+ // lazily
77
+ location = () => (0, file_utils_js_1.svgPathToFile)(this._path, imageSize);
78
+ if (imageSize) {
79
+ width = imageSize.w;
80
+ height = imageSize.h;
81
+ }
82
+ else {
83
+ width = height = 512;
84
+ }
74
85
  size = Infinity; // this doesn't really matter
75
86
  break;
87
+ }
76
88
  case 'videoSizeEmojiMarkup':
77
89
  case 'videoSizeStickerMarkup':
78
90
  location = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"thumbnail.js","sourceRoot":"","sources":["../../../../../src/highlevel/types/media/thumbnail.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id'\nimport { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { MtArgumentError, MtTypeAssertionError } from '../../../types/errors.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { inflateSvgPath, strippedPhotoToJpg, svgPathToFile } from '../../utils/file-utils.js'\nimport { makeInspectable } from '../../utils/index.js'\nimport { memoizeGetters } from '../../utils/memoize.js'\nimport { FileLocation } from '../files/index.js'\n\n/**\n * One size of some thumbnail\n */\nexport class Thumbnail extends FileLocation {\n // see: https://core.telegram.org/api/files#image-thumbnail-types\n static readonly THUMB_100x100_BOX = 's'\n static readonly THUMB_320x320_BOX = 'm'\n static readonly THUMB_800x800_BOX = 'x'\n static readonly THUMB_1280x1280_BOX = 'y'\n static readonly THUMB_2560x2560_BOX = 'w'\n\n static readonly THUMB_160x160_CROP = 'a'\n static readonly THUMB_320x320_CROP = 'b'\n static readonly THUMB_640x640_CROP = 'c'\n static readonly THUMB_1280x1280_CROP = 'd'\n\n static readonly THUMB_STRIP = 'i'\n static readonly THUMB_OUTLINE = 'j'\n\n /** Animated profile pictures preview */\n static readonly THUMB_VIDEO_PROFILE = 'u'\n /** Trimmed and downscaled video previews */\n static readonly THUMB_VIDEO_PREVIEW = 'v'\n /** Fullscreen animation for Premium stickers */\n static readonly THUMB_VIDEO_FULLSCREEN = 'f'\n\n /** (non-standard) Emoji-based markup for profile photo */\n static readonly THUMB_EMOJI_MARKUP = 'pfp_em'\n /** (non-standard) Sticker-based markup for profile photo */\n static readonly THUMB_STICKER_MARKUP = 'pfp_st'\n\n readonly raw: tl.TypePhotoSize | tl.TypeVideoSize\n\n /**\n * Thumbnail width\n * (`NaN` for {@link THUMB_OUTLINE} and {@link THUMB_STRIP})\n */\n readonly width: number\n\n /**\n * Thumbnail height\n * (`NaN` for {@link THUMB_OUTLINE} and {@link THUMB_STRIP})\n */\n readonly height: number\n\n private _path?: string\n private _media: tl.RawPhoto | tl.RawDocument | tl.RawStickerSet | tl.RawMessageExtendedMediaPreview\n\n constructor(\n media: tl.RawPhoto | tl.RawDocument | tl.RawStickerSet | tl.RawMessageExtendedMediaPreview,\n sz: tl.TypePhotoSize | tl.TypeVideoSize,\n ) {\n switch (sz._) {\n case 'photoSizeEmpty':\n case 'photoCachedSize':\n throw new MtTypeAssertionError('sz', 'not (photoSizeEmpty | photoCachedSize)', sz._)\n }\n\n let location: tl.TypeInputFileLocation | Uint8Array | (() => tl.TypeInputFileLocation | Uint8Array)\n let size\n let width\n let height: number\n\n switch (sz._) {\n case 'photoStrippedSize':\n location = strippedPhotoToJpg(sz.bytes)\n width = height = NaN\n size = location.length\n break\n case 'photoPathSize': // lazily\n location = () => svgPathToFile(this._path!)\n width = height = NaN\n size = Infinity // this doesn't really matter\n break\n case 'videoSizeEmojiMarkup':\n case 'videoSizeStickerMarkup':\n location = () => {\n throw new MtArgumentError('Cannot download thumbnail with emoji/sticker markup, try other size')\n }\n width = height = NaN\n size = Infinity\n break\n default:\n if (media._ === 'stickerSet') {\n location = {\n _: 'inputStickerSetThumb',\n stickerset: {\n _: 'inputStickerSetID',\n id: media.id,\n accessHash: media.accessHash,\n },\n thumbVersion: media.thumbVersion!,\n }\n } else if (media._ === 'messageExtendedMediaPreview') {\n // according to tdlib and tdesktop sources, sz can only be photoStrippedSize\n throw new MtTypeAssertionError('messageExtendedMediaPreview#thumb', 'photoStrippedSize', sz._)\n } else {\n location = {\n _: media._ === 'photo' ? 'inputPhotoFileLocation' : 'inputDocumentFileLocation',\n id: media.id,\n fileReference: media.fileReference,\n accessHash: media.accessHash,\n thumbSize: sz.type,\n }\n }\n width = sz.w\n height = sz.h\n size = sz._ === 'photoSizeProgressive' ? Math.max(...sz.sizes) : sz.size\n break\n }\n\n let dcId: number | undefined\n\n if (media._ === 'stickerSet') {\n dcId = media.thumbDcId\n } else if (media._ === 'messageExtendedMediaPreview') {\n dcId = 0\n } else {\n dcId = media.dcId\n }\n\n super(location, size, dcId)\n this.raw = sz\n this.width = width\n this.height = height\n this._media = media\n\n if (sz._ === 'photoPathSize') {\n this._path = inflateSvgPath(sz.bytes)\n }\n }\n\n get isVideo(): boolean {\n return this.raw._ === 'videoSize'\n }\n\n /**\n * Thumbnail type\n */\n get type(): string {\n if (this.raw._ === 'videoSizeEmojiMarkup') {\n return Thumbnail.THUMB_EMOJI_MARKUP\n }\n if (this.raw._ === 'videoSizeStickerMarkup') {\n return Thumbnail.THUMB_STICKER_MARKUP\n }\n\n return this.raw.type\n }\n\n /**\n * If {@link raw} is `tl.RawPhotoPathSize` (i.e. `raw.type === Thumbnail.THUMB_OUTLINE`),\n * this property will return raw SVG path of the preview.\n *\n * When downloading path thumbnails, a valid SVG file is returned.\n *\n * See also: https://core.telegram.org/api/files#vector-thumbnails\n *\n * @throws MtTypeAssertionError In case {@link raw} is not `tl.RawPhotoPathSize`\n */\n get path(): string {\n assertTypeIs('Thumbnail#path', this.raw, 'photoPathSize')\n\n return this._path!\n }\n\n /**\n * Get TDLib and Bot API compatible File ID\n * representing this thumbnail.\n *\n * > **Note:** You can't use this file id to send a thumbnail,\n * > only to download it.\n */\n get fileId(): string {\n if (\n (this.raw._ !== 'photoSize' && this.raw._ !== 'photoSizeProgressive' && this.raw._ !== 'videoSize') ||\n this._media._ === 'messageExtendedMediaPreview' // just for type safety\n ) {\n throw new MtArgumentError(`Cannot generate a file ID for \"${this.type}\"`)\n }\n\n if (this._media._ === 'stickerSet') {\n return toFileId(getPlatform(), {\n type: td.FileType.Thumbnail,\n dcId: this.dcId!,\n fileReference: null,\n location: {\n _: 'photo',\n id: Long.ZERO,\n accessHash: Long.ZERO,\n source: {\n _: 'stickerSetThumbnailVersion',\n id: this._media.id,\n accessHash: this._media.accessHash,\n version: this._media.thumbVersion!,\n },\n },\n })\n }\n\n return toFileId(getPlatform(), {\n type: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n dcId: this.dcId!,\n fileReference: this._media.fileReference,\n location: {\n _: 'photo',\n id: this._media.id,\n accessHash: this._media.accessHash,\n source: {\n _: 'thumbnail',\n fileType: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n thumbnailType: this.raw.type === 'u' ? '\\x00' : this.raw.type,\n },\n },\n })\n }\n\n /**\n * Get a unique File ID representing this thumbnail.\n */\n get uniqueFileId(): string {\n if (\n (this.raw._ !== 'photoSize' && this.raw._ !== 'photoSizeProgressive' && this.raw._ !== 'videoSize') ||\n this._media._ === 'messageExtendedMediaPreview' // just for type safety\n ) {\n throw new MtArgumentError(`Cannot generate a unique file ID for \"${this.type}\"`)\n }\n\n if (this._media._ === 'stickerSet') {\n return toUniqueFileId(getPlatform(), td.FileType.Thumbnail, {\n _: 'photo',\n id: Long.ZERO,\n source: {\n _: 'stickerSetThumbnailVersion',\n id: this._media.id,\n accessHash: this._media.accessHash,\n version: this._media.thumbVersion!,\n },\n })\n }\n\n return toUniqueFileId(getPlatform(), this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail, {\n _: 'photo',\n id: this._media.id,\n source: {\n _: 'thumbnail',\n fileType: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n thumbnailType: this.raw.type === 'u' ? '\\x00' : this.raw.type,\n },\n })\n }\n}\n\nmemoizeGetters(Thumbnail, ['fileId', 'uniqueFileId'])\nmakeInspectable(Thumbnail, ['fileSize', 'dcId', 'width', 'height'], ['path'])\n"]}
1
+ {"version":3,"file":"thumbnail.js","sourceRoot":"","sources":["../../../../../src/highlevel/types/media/thumbnail.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id'\nimport { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { MtArgumentError, MtTypeAssertionError } from '../../../types/errors.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { inflateSvgPath, strippedPhotoToJpg, svgPathToFile } from '../../utils/file-utils.js'\nimport { makeInspectable } from '../../utils/index.js'\nimport { memoizeGetters } from '../../utils/memoize.js'\nimport { FileLocation } from '../files/index.js'\n\n/**\n * One size of some thumbnail\n */\nexport class Thumbnail extends FileLocation {\n // see: https://core.telegram.org/api/files#image-thumbnail-types\n static readonly THUMB_100x100_BOX = 's'\n static readonly THUMB_320x320_BOX = 'm'\n static readonly THUMB_800x800_BOX = 'x'\n static readonly THUMB_1280x1280_BOX = 'y'\n static readonly THUMB_2560x2560_BOX = 'w'\n\n static readonly THUMB_160x160_CROP = 'a'\n static readonly THUMB_320x320_CROP = 'b'\n static readonly THUMB_640x640_CROP = 'c'\n static readonly THUMB_1280x1280_CROP = 'd'\n\n static readonly THUMB_STRIP = 'i'\n static readonly THUMB_OUTLINE = 'j'\n\n /** Animated profile pictures preview */\n static readonly THUMB_VIDEO_PROFILE = 'u'\n /** Trimmed and downscaled video previews */\n static readonly THUMB_VIDEO_PREVIEW = 'v'\n /** Fullscreen animation for Premium stickers */\n static readonly THUMB_VIDEO_FULLSCREEN = 'f'\n\n /** (non-standard) Emoji-based markup for profile photo */\n static readonly THUMB_EMOJI_MARKUP = 'pfp_em'\n /** (non-standard) Sticker-based markup for profile photo */\n static readonly THUMB_STICKER_MARKUP = 'pfp_st'\n\n readonly raw: tl.TypePhotoSize | tl.TypeVideoSize\n\n /**\n * Thumbnail width\n * (`NaN` for {@link THUMB_OUTLINE} and {@link THUMB_STRIP})\n */\n readonly width: number\n\n /**\n * Thumbnail height\n * (`NaN` for {@link THUMB_OUTLINE} and {@link THUMB_STRIP})\n */\n readonly height: number\n\n private _path?: string\n private _media: tl.RawPhoto | tl.RawDocument | tl.RawStickerSet | tl.RawMessageExtendedMediaPreview\n\n constructor(\n media: tl.RawPhoto | tl.RawDocument | tl.RawStickerSet | tl.RawMessageExtendedMediaPreview,\n sz: tl.TypePhotoSize | tl.TypeVideoSize,\n ) {\n switch (sz._) {\n case 'photoSizeEmpty':\n case 'photoCachedSize':\n throw new MtTypeAssertionError('sz', 'not (photoSizeEmpty | photoCachedSize)', sz._)\n }\n\n let location: tl.TypeInputFileLocation | Uint8Array | (() => tl.TypeInputFileLocation | Uint8Array)\n let size\n let width\n let height: number\n\n switch (sz._) {\n case 'photoStrippedSize':\n location = strippedPhotoToJpg(sz.bytes)\n width = height = NaN\n size = location.length\n break\n case 'photoPathSize': {\n // try to find documentAttributeImageSize\n const imageSize = media._ === 'document' ?\n media.attributes.find((it) => it._ === 'documentAttributeImageSize') as tl.RawDocumentAttributeImageSize :\n undefined\n // lazily\n location = () => svgPathToFile(this._path!, imageSize)\n\n if (imageSize) {\n width = imageSize.w\n height = imageSize.h\n } else {\n width = height = 512\n }\n size = Infinity // this doesn't really matter\n break\n }\n case 'videoSizeEmojiMarkup':\n case 'videoSizeStickerMarkup':\n location = () => {\n throw new MtArgumentError('Cannot download thumbnail with emoji/sticker markup, try other size')\n }\n width = height = NaN\n size = Infinity\n break\n default:\n if (media._ === 'stickerSet') {\n location = {\n _: 'inputStickerSetThumb',\n stickerset: {\n _: 'inputStickerSetID',\n id: media.id,\n accessHash: media.accessHash,\n },\n thumbVersion: media.thumbVersion!,\n }\n } else if (media._ === 'messageExtendedMediaPreview') {\n // according to tdlib and tdesktop sources, sz can only be photoStrippedSize\n throw new MtTypeAssertionError('messageExtendedMediaPreview#thumb', 'photoStrippedSize', sz._)\n } else {\n location = {\n _: media._ === 'photo' ? 'inputPhotoFileLocation' : 'inputDocumentFileLocation',\n id: media.id,\n fileReference: media.fileReference,\n accessHash: media.accessHash,\n thumbSize: sz.type,\n }\n }\n width = sz.w\n height = sz.h\n size = sz._ === 'photoSizeProgressive' ? Math.max(...sz.sizes) : sz.size\n break\n }\n\n let dcId: number | undefined\n\n if (media._ === 'stickerSet') {\n dcId = media.thumbDcId\n } else if (media._ === 'messageExtendedMediaPreview') {\n dcId = 0\n } else {\n dcId = media.dcId\n }\n\n super(location, size, dcId)\n this.raw = sz\n this.width = width\n this.height = height\n this._media = media\n\n if (sz._ === 'photoPathSize') {\n this._path = inflateSvgPath(sz.bytes)\n }\n }\n\n get isVideo(): boolean {\n return this.raw._ === 'videoSize'\n }\n\n /**\n * Thumbnail type\n */\n get type(): string {\n if (this.raw._ === 'videoSizeEmojiMarkup') {\n return Thumbnail.THUMB_EMOJI_MARKUP\n }\n if (this.raw._ === 'videoSizeStickerMarkup') {\n return Thumbnail.THUMB_STICKER_MARKUP\n }\n\n return this.raw.type\n }\n\n /**\n * If {@link raw} is `tl.RawPhotoPathSize` (i.e. `raw.type === Thumbnail.THUMB_OUTLINE`),\n * this property will return raw SVG path of the preview.\n *\n * When downloading path thumbnails, a valid SVG file is returned.\n *\n * See also: https://core.telegram.org/api/files#vector-thumbnails\n *\n * @throws MtTypeAssertionError In case {@link raw} is not `tl.RawPhotoPathSize`\n */\n get path(): string {\n assertTypeIs('Thumbnail#path', this.raw, 'photoPathSize')\n\n return this._path!\n }\n\n /**\n * Get TDLib and Bot API compatible File ID\n * representing this thumbnail.\n *\n * > **Note:** You can't use this file id to send a thumbnail,\n * > only to download it.\n */\n get fileId(): string {\n if (\n (this.raw._ !== 'photoSize' && this.raw._ !== 'photoSizeProgressive' && this.raw._ !== 'videoSize') ||\n this._media._ === 'messageExtendedMediaPreview' // just for type safety\n ) {\n throw new MtArgumentError(`Cannot generate a file ID for \"${this.type}\"`)\n }\n\n if (this._media._ === 'stickerSet') {\n return toFileId(getPlatform(), {\n type: td.FileType.Thumbnail,\n dcId: this.dcId!,\n fileReference: null,\n location: {\n _: 'photo',\n id: Long.ZERO,\n accessHash: Long.ZERO,\n source: {\n _: 'stickerSetThumbnailVersion',\n id: this._media.id,\n accessHash: this._media.accessHash,\n version: this._media.thumbVersion!,\n },\n },\n })\n }\n\n return toFileId(getPlatform(), {\n type: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n dcId: this.dcId!,\n fileReference: this._media.fileReference,\n location: {\n _: 'photo',\n id: this._media.id,\n accessHash: this._media.accessHash,\n source: {\n _: 'thumbnail',\n fileType: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n thumbnailType: this.raw.type === 'u' ? '\\x00' : this.raw.type,\n },\n },\n })\n }\n\n /**\n * Get a unique File ID representing this thumbnail.\n */\n get uniqueFileId(): string {\n if (\n (this.raw._ !== 'photoSize' && this.raw._ !== 'photoSizeProgressive' && this.raw._ !== 'videoSize') ||\n this._media._ === 'messageExtendedMediaPreview' // just for type safety\n ) {\n throw new MtArgumentError(`Cannot generate a unique file ID for \"${this.type}\"`)\n }\n\n if (this._media._ === 'stickerSet') {\n return toUniqueFileId(getPlatform(), td.FileType.Thumbnail, {\n _: 'photo',\n id: Long.ZERO,\n source: {\n _: 'stickerSetThumbnailVersion',\n id: this._media.id,\n accessHash: this._media.accessHash,\n version: this._media.thumbVersion!,\n },\n })\n }\n\n return toUniqueFileId(getPlatform(), this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail, {\n _: 'photo',\n id: this._media.id,\n source: {\n _: 'thumbnail',\n fileType: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n thumbnailType: this.raw.type === 'u' ? '\\x00' : this.raw.type,\n },\n })\n }\n}\n\nmemoizeGetters(Thumbnail, ['fileId', 'uniqueFileId'])\nmakeInspectable(Thumbnail, ['fileSize', 'dcId', 'width', 'height'], ['path'])\n"]}
@@ -1,3 +1,4 @@
1
+ import { tl } from '@mtcute/tl';
1
2
  /**
2
3
  * Given file size, determine the appropriate chunk size (in KB)
3
4
  * for upload/download operations.
@@ -18,9 +19,10 @@ export declare function strippedPhotoToJpg(stripped: Uint8Array): Uint8Array;
18
19
  export declare function inflateSvgPath(encoded: Uint8Array): string;
19
20
  /**
20
21
  * Convert SVG path to SVG file
21
- * @param path
22
+ * @param path SVG path
23
+ * @param size Size attribute of the document, if available
22
24
  */
23
- export declare function svgPathToFile(path: string): Uint8Array;
25
+ export declare function svgPathToFile(path: string, size?: tl.RawDocumentAttributeImageSize): Uint8Array;
24
26
  /**
25
27
  * Get file name from file path
26
28
  *
@@ -97,12 +97,13 @@ function inflateSvgPath(encoded) {
97
97
  exports.inflateSvgPath = inflateSvgPath;
98
98
  /**
99
99
  * Convert SVG path to SVG file
100
- * @param path
100
+ * @param path SVG path
101
+ * @param size Size attribute of the document, if available
101
102
  */
102
- function svgPathToFile(path) {
103
+ function svgPathToFile(path, size) {
103
104
  return (0, platform_js_1.getPlatform)().utf8Encode('<?xml version="1.0" encoding="utf-8"?>' +
104
105
  '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"' +
105
- 'viewBox="0 0 512 512" xml:space="preserve">' +
106
+ `viewBox="0 0 ${size?.w ?? 512} ${size?.h ?? 512}" xml:space="preserve">` +
106
107
  '<path d="' +
107
108
  path +
108
109
  '"/>' +
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/file-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPlatform } from '../../platform.js'\nimport { MtArgumentError } from '../../types/errors.js'\nimport { concatBuffers } from '../../utils/buffer-utils.js'\n\n/**\n * Given file size, determine the appropriate chunk size (in KB)\n * for upload/download operations.\n */\nexport function determinePartSize(fileSize: number): number {\n if (fileSize <= 262078465) return 128 // 200 MB\n if (fileSize <= 786432000) return 256 // 750 MB\n if (fileSize <= 2097152000) return 512 // 2000 MB\n\n throw new MtArgumentError('File is too large')\n}\n\n/**\n * Returns `true` if all bytes in `buf` are printable ASCII characters\n */\nexport function isProbablyPlainText(buf: Uint8Array): boolean {\n return !buf.some(\n (it) =>\n !(\n (\n (it >= 0x20 && it < 0x7f) || // printable ascii range\n it === 0x0d || // CR\n it === 0x0a || // LF\n it === 0x09\n ) // Tab\n ),\n )\n}\n\n// from https://github.com/telegramdesktop/tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225\nconst JPEG_HEADER = () =>\n getPlatform().hexDecode(\n 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e1928' +\n '2321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aad' +\n 'aad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c35' +\n '3c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f' +\n '8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc0001108000000' +\n '0003012200021101031101ffc4001f0000010501010101010100000000000000000' +\n '102030405060708090a0bffc400b5100002010303020403050504040000017d0102' +\n '0300041105122131410613516107227114328191a1082342b1c11552d1f02433627' +\n '282090a161718191a25262728292a3435363738393a434445464748494a53545556' +\n '5758595a636465666768696a737475767778797a838485868788898a92939495969' +\n '798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4' +\n 'd5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030' +\n '101010101010101010000000000000102030405060708090a0bffc400b511000201' +\n '0204040304070504040001027700010203110405213106124151076171132232810' +\n '8144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a3536' +\n '3738393a434445464748494a535455565758595a636465666768696a73747576777' +\n '8797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5' +\n 'b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f' +\n '3f4f5f6f7f8f9faffda000c03010002110311003f00',\n )\nlet JPEG_HEADER_BYTES: Uint8Array | null = null\nconst JPEG_FOOTER = new Uint8Array([0xff, 0xd9])\n\n/**\n * Convert stripped JPEG (from `photoStrippedSize`) to full JPEG\n */\nexport function strippedPhotoToJpg(stripped: Uint8Array): Uint8Array {\n if (stripped.length < 3 || stripped[0] !== 1) {\n throw new MtArgumentError('Invalid stripped JPEG')\n }\n\n if (JPEG_HEADER_BYTES === null) {\n JPEG_HEADER_BYTES = JPEG_HEADER()\n }\n\n const result = concatBuffers([JPEG_HEADER_BYTES, stripped.slice(3), JPEG_FOOTER])\n result[164] = stripped[1]\n result[166] = stripped[2]\n\n return result\n}\n\nconst SVG_LOOKUP = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,'\n\n/**\n * Inflate compressed preview SVG path to full SVG path\n * @param encoded\n */\nexport function inflateSvgPath(encoded: Uint8Array): string {\n let path = 'M'\n const len = encoded.length\n\n for (let i = 0; i < len; i++) {\n const num = encoded[i]\n\n if (num >= 192) {\n // 128 + 64\n path += SVG_LOOKUP[num - 192]\n } else {\n if (num >= 128) {\n path += ','\n } else if (num >= 64) {\n path += '-'\n }\n\n path += num & 63\n }\n }\n\n path += 'z'\n\n return path\n}\n\n/**\n * Convert SVG path to SVG file\n * @param path\n */\nexport function svgPathToFile(path: string): Uint8Array {\n return getPlatform().utf8Encode(\n '<?xml version=\"1.0\" encoding=\"utf-8\"?>' +\n '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"' +\n 'viewBox=\"0 0 512 512\" xml:space=\"preserve\">' +\n '<path d=\"' +\n path +\n '\"/>' +\n '</svg>',\n )\n}\n\n/**\n * Get file name from file path\n *\n * @param path File path\n */\nexport function extractFileName(path: string): string {\n if (path.startsWith('file:')) path = path.slice(5)\n\n return path.split(/[\\\\/]/).pop()!.split('?')[0]\n}\n"]}
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/file-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../platform.js'\nimport { MtArgumentError } from '../../types/errors.js'\nimport { concatBuffers } from '../../utils/buffer-utils.js'\n\n/**\n * Given file size, determine the appropriate chunk size (in KB)\n * for upload/download operations.\n */\nexport function determinePartSize(fileSize: number): number {\n if (fileSize <= 262078465) return 128 // 200 MB\n if (fileSize <= 786432000) return 256 // 750 MB\n if (fileSize <= 2097152000) return 512 // 2000 MB\n\n throw new MtArgumentError('File is too large')\n}\n\n/**\n * Returns `true` if all bytes in `buf` are printable ASCII characters\n */\nexport function isProbablyPlainText(buf: Uint8Array): boolean {\n return !buf.some(\n (it) =>\n !(\n (\n (it >= 0x20 && it < 0x7f) || // printable ascii range\n it === 0x0d || // CR\n it === 0x0a || // LF\n it === 0x09\n ) // Tab\n ),\n )\n}\n\n// from https://github.com/telegramdesktop/tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225\nconst JPEG_HEADER = () =>\n getPlatform().hexDecode(\n 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e1928' +\n '2321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aad' +\n 'aad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c35' +\n '3c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f' +\n '8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc0001108000000' +\n '0003012200021101031101ffc4001f0000010501010101010100000000000000000' +\n '102030405060708090a0bffc400b5100002010303020403050504040000017d0102' +\n '0300041105122131410613516107227114328191a1082342b1c11552d1f02433627' +\n '282090a161718191a25262728292a3435363738393a434445464748494a53545556' +\n '5758595a636465666768696a737475767778797a838485868788898a92939495969' +\n '798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4' +\n 'd5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030' +\n '101010101010101010000000000000102030405060708090a0bffc400b511000201' +\n '0204040304070504040001027700010203110405213106124151076171132232810' +\n '8144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a3536' +\n '3738393a434445464748494a535455565758595a636465666768696a73747576777' +\n '8797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5' +\n 'b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f' +\n '3f4f5f6f7f8f9faffda000c03010002110311003f00',\n )\nlet JPEG_HEADER_BYTES: Uint8Array | null = null\nconst JPEG_FOOTER = new Uint8Array([0xff, 0xd9])\n\n/**\n * Convert stripped JPEG (from `photoStrippedSize`) to full JPEG\n */\nexport function strippedPhotoToJpg(stripped: Uint8Array): Uint8Array {\n if (stripped.length < 3 || stripped[0] !== 1) {\n throw new MtArgumentError('Invalid stripped JPEG')\n }\n\n if (JPEG_HEADER_BYTES === null) {\n JPEG_HEADER_BYTES = JPEG_HEADER()\n }\n\n const result = concatBuffers([JPEG_HEADER_BYTES, stripped.slice(3), JPEG_FOOTER])\n result[164] = stripped[1]\n result[166] = stripped[2]\n\n return result\n}\n\nconst SVG_LOOKUP = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,'\n\n/**\n * Inflate compressed preview SVG path to full SVG path\n * @param encoded\n */\nexport function inflateSvgPath(encoded: Uint8Array): string {\n let path = 'M'\n const len = encoded.length\n\n for (let i = 0; i < len; i++) {\n const num = encoded[i]\n\n if (num >= 192) {\n // 128 + 64\n path += SVG_LOOKUP[num - 192]\n } else {\n if (num >= 128) {\n path += ','\n } else if (num >= 64) {\n path += '-'\n }\n\n path += num & 63\n }\n }\n\n path += 'z'\n\n return path\n}\n\n/**\n * Convert SVG path to SVG file\n * @param path SVG path\n * @param size Size attribute of the document, if available\n */\nexport function svgPathToFile(path: string, size?: tl.RawDocumentAttributeImageSize): Uint8Array {\n return getPlatform().utf8Encode(\n '<?xml version=\"1.0\" encoding=\"utf-8\"?>' +\n '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"' +\n `viewBox=\"0 0 ${size?.w ?? 512} ${size?.h ?? 512}\" xml:space=\"preserve\">` +\n '<path d=\"' +\n path +\n '\"/>' +\n '</svg>',\n )\n}\n\n/**\n * Get file name from file path\n *\n * @param path File path\n */\nexport function extractFileName(path: string): string {\n if (path.startsWith('file:')) path = path.slice(5)\n\n return path.split(/[\\\\/]/).pop()!.split('?')[0]\n}\n"]}
@@ -44,7 +44,7 @@ exports.decodeWaveform = decodeWaveform;
44
44
  */
45
45
  function encodeWaveform(wf) {
46
46
  const bitsCount = wf.length * 5;
47
- const bytesCount = ~~(bitsCount + 7) / 8;
47
+ const bytesCount = ~~((bitsCount + 7) / 8);
48
48
  const result = new Uint8Array(bytesCount + 1);
49
49
  const dv = (0, buffer_utils_js_1.dataViewFromBuffer)(result);
50
50
  // Write each 0-31 unsigned char as 5 bit to result.
@@ -1 +1 @@
1
- {"version":3,"file":"voice-utils.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/voice-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { dataViewFromBuffer } from '../../utils/buffer-utils.js'\n\n/**\n * Decode 5-bit encoded voice message waveform into\n * an array of waveform values (0-32).\n *\n * @param wf Encoded waveform\n */\nexport function decodeWaveform(wf: Uint8Array): number[] {\n const bitsCount = wf.length * 8\n const valuesCount = ~~(bitsCount / 5)\n\n if (!valuesCount) return []\n\n const lastIdx = valuesCount - 1\n\n // Read each 5 bit of encoded 5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries except the last one.\n\n const result: number[] = []\n const dv = dataViewFromBuffer(wf)\n\n for (let i = 0, j = 0; i < lastIdx; i++, j += 5) {\n const byteIdx = ~~(j / 8)\n const bitShift = j % 8\n result[i] = (dv.getUint16(byteIdx, true) >> bitShift) & 0b11111\n }\n\n const lastByteIdx = ~~((lastIdx * 5) / 8)\n const lastBitShift = (lastIdx * 5) % 8\n const lastValue = lastByteIdx === wf.length - 1 ? wf[lastByteIdx] : dv.getUint16(lastByteIdx, true)\n result[lastIdx] = (lastValue >> lastBitShift) & 0b11111\n\n return result\n}\n\n/**\n * Encode an array of waveform values into\n * 5-bit encoded voice message waveform into\n *\n * @param wf Waveform values\n */\nexport function encodeWaveform(wf: number[]): Uint8Array {\n const bitsCount = wf.length * 5\n const bytesCount = ~~(bitsCount + 7) / 8\n const result = new Uint8Array(bytesCount + 1)\n const dv = dataViewFromBuffer(result)\n\n // Write each 0-31 unsigned char as 5 bit to result.\n // We reserve one extra byte to be able to dereference any of required bytes\n // as a uint16 without overflowing, even the byte with index \"bytesCount - 1\".\n\n for (let i = 0, j = 0; i < wf.length; i++, j += 5) {\n const byteIdx = ~~(j / 8)\n const bitShift = j % 8\n const value = (wf[i] & 0b11111) << bitShift\n\n // const old = result.readUInt16LE(byteIdx)\n // result.writeUInt16LE(old | value, byteIdx)\n dv.setUint16(byteIdx, dv.getUint16(byteIdx, true) | value, true)\n }\n\n return result.slice(0, bytesCount)\n}\n"]}
1
+ {"version":3,"file":"voice-utils.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/voice-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { dataViewFromBuffer } from '../../utils/buffer-utils.js'\n\n/**\n * Decode 5-bit encoded voice message waveform into\n * an array of waveform values (0-32).\n *\n * @param wf Encoded waveform\n */\nexport function decodeWaveform(wf: Uint8Array): number[] {\n const bitsCount = wf.length * 8\n const valuesCount = ~~(bitsCount / 5)\n\n if (!valuesCount) return []\n\n const lastIdx = valuesCount - 1\n\n // Read each 5 bit of encoded 5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries except the last one.\n\n const result: number[] = []\n const dv = dataViewFromBuffer(wf)\n\n for (let i = 0, j = 0; i < lastIdx; i++, j += 5) {\n const byteIdx = ~~(j / 8)\n const bitShift = j % 8\n result[i] = (dv.getUint16(byteIdx, true) >> bitShift) & 0b11111\n }\n\n const lastByteIdx = ~~((lastIdx * 5) / 8)\n const lastBitShift = (lastIdx * 5) % 8\n const lastValue = lastByteIdx === wf.length - 1 ? wf[lastByteIdx] : dv.getUint16(lastByteIdx, true)\n result[lastIdx] = (lastValue >> lastBitShift) & 0b11111\n\n return result\n}\n\n/**\n * Encode an array of waveform values into\n * 5-bit encoded voice message waveform into\n *\n * @param wf Waveform values\n */\nexport function encodeWaveform(wf: number[]): Uint8Array {\n const bitsCount = wf.length * 5\n const bytesCount = ~~((bitsCount + 7) / 8)\n const result = new Uint8Array(bytesCount + 1)\n const dv = dataViewFromBuffer(result)\n\n // Write each 0-31 unsigned char as 5 bit to result.\n // We reserve one extra byte to be able to dereference any of required bytes\n // as a uint16 without overflowing, even the byte with index \"bytesCount - 1\".\n\n for (let i = 0, j = 0; i < wf.length; i++, j += 5) {\n const byteIdx = ~~(j / 8)\n const bitShift = j % 8\n const value = (wf[i] & 0b11111) << bitShift\n\n // const old = result.readUInt16LE(byteIdx)\n // result.writeUInt16LE(old | value, byteIdx)\n dv.setUint16(byteIdx, dv.getUint16(byteIdx, true) | value, true)\n }\n\n return result.slice(0, bytesCount)\n}\n"]}
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.deserializeResult = exports.serializeResult = void 0;
7
7
  const long_1 = __importDefault(require("long"));
8
8
  function serializeResult(result) {
9
+ if (ArrayBuffer.isView(result))
10
+ return result;
9
11
  if (Array.isArray(result)) {
10
12
  return result.map(serializeResult);
11
13
  }
@@ -42,6 +44,8 @@ function serializeResult(result) {
42
44
  }
43
45
  exports.serializeResult = serializeResult;
44
46
  function deserializeResult(result) {
47
+ if (ArrayBuffer.isView(result))
48
+ return result;
45
49
  if (Array.isArray(result)) {
46
50
  return result.map(deserializeResult);
47
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/protocol.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AA+DvB,SAAgB,eAAe,CAAI,MAAS;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,CAAmC,CAAA;IACxE,CAAC;IAED,IAAI,MAAM,YAAY,GAAG,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3C,CAAC;QAED,OAAO,MAAwC,CAAA;IACnD,CAAC;IAED,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvC,+CAA+C;QAC/C,MAAM,SAAS,GAA4B,EAAE,CAAA;QAE7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,cAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,2BAA2B;gBAC3B,SAAS,CAAC,GAAG,CAAC,GAAG;oBACb,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBAC3B,CAAA;YACL,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnC,2BAA2B;gBAC3B,SAAS,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;YAC3C,CAAC;iBAAM,CAAC;gBACJ,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YAC1B,CAAC;QACL,CAAC;QAED,OAAO,SAA2C,CAAA;IACtD,CAAC;IAED,OAAO,MAAwC,CAAA;AACnD,CAAC;AAtCD,0CAsCC;AAED,SAAgB,iBAAiB,CAAI,MAA2B;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAiB,CAAA;IACxD,CAAC;IAED,IAAI,MAAM,YAAY,GAAG,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,iEAAiE;YACjE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,MAAsB,CAAA;IACjC,CAAC;IAED,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAgC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC5F,2BAA2B;gBAC3B,CAAC;gBAAC,MAAc,CAAC,GAAG,CAAC,GAAG,cAAI,CAAC,SAAS,CAAC,KAAwB,CAAC,CAAA;YACpE,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnC,2BAA2B;gBAC3B,CAAC;gBAAC,MAAc,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAkC,CAAC,CAAA;YACjF,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAsB,CAAA;AACjC,CAAC;AA3BD,8CA2BC","sourcesContent":["import Long from 'long'\nimport type { Worker as NodeWorker } from 'node:worker_threads'\n\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionState } from '../client.types.js'\nimport { SerializedError } from './errors.js'\n\nexport type WorkerInboundMessage =\n | {\n type: 'invoke'\n id: number\n target: 'custom' | 'client' | 'storage' | 'storage-self' | 'storage-peers' | 'app-config'\n method: string\n args: SerializedResult<unknown[]>\n void: boolean\n withAbort: boolean\n }\n | {\n type: 'abort'\n id: number\n }\n\nexport type WorkerOutboundMessage =\n | { type: 'server_update'; update: SerializedResult<tl.TypeUpdates> }\n | {\n type: 'update'\n update: SerializedResult<tl.TypeUpdate>\n users: SerializedResult<Map<number, tl.TypeUser>>\n chats: SerializedResult<Map<number, tl.TypeChat>>\n hasMin: boolean\n }\n | { type: 'error'; error: unknown }\n | { type: 'stop' }\n | { type: 'conn_state'; state: ConnectionState }\n | {\n type: 'log'\n color: number\n level: number\n tag: string\n fmt: string\n args: unknown[]\n }\n | {\n type: 'result'\n id: number\n result?: SerializedResult<unknown>\n error?: SerializedError\n }\n\nexport type SomeWorker = NodeWorker | Worker | SharedWorker\n\nexport type SendFn = (message: WorkerInboundMessage) => void\nexport type ClientMessageHandler = (message: WorkerOutboundMessage) => void\n\nexport type RespondFn = (message: WorkerOutboundMessage) => void\nexport type WorkerMessageHandler = (message: WorkerInboundMessage, respond: RespondFn) => void\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WorkerCustomMethods = Record<string, (...args: any[]) => Promise<any>>\n\nexport type SerializedResult<T> = { __serialized__: T }\n\nexport function serializeResult<T>(result: T): SerializedResult<T> {\n if (Array.isArray(result)) {\n return result.map(serializeResult) as unknown as SerializedResult<T>\n }\n\n if (result instanceof Map) {\n for (const [key, value] of result.entries()) {\n result.set(key, serializeResult(value))\n }\n\n return result as unknown as SerializedResult<T>\n }\n\n if (result && typeof result === 'object') {\n // replace Long instances with a special object\n const newResult: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(result)) {\n if (Long.isLong(value)) {\n // eslint-disable-next-line\n newResult[key] = {\n __type: 'long',\n low: value.low,\n high: value.high,\n unsigned: value.unsigned,\n }\n } else if (typeof value === 'object') {\n // eslint-disable-next-line\n newResult[key] = serializeResult(value)\n } else {\n newResult[key] = value\n }\n }\n\n return newResult as unknown as SerializedResult<T>\n }\n\n return result as unknown as SerializedResult<T>\n}\n\nexport function deserializeResult<T>(result: SerializedResult<T>): T {\n if (Array.isArray(result)) {\n return result.map(deserializeResult) as unknown as T\n }\n\n if (result instanceof Map) {\n for (const [key, value] of result.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n result.set(key, deserializeResult(value))\n }\n\n return result as unknown as T\n }\n\n if (result && typeof result === 'object') {\n for (const [key, value] of Object.entries(result)) {\n if (value && typeof value === 'object' && (value as Record<string, string>).__type === 'long') {\n // eslint-disable-next-line\n ;(result as any)[key] = Long.fromValue(value as unknown as Long)\n } else if (typeof value === 'object') {\n // eslint-disable-next-line\n ;(result as any)[key] = deserializeResult(value as SerializedResult<unknown>)\n }\n }\n }\n\n return result as unknown as T\n}\n"]}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\nimport type { Worker as NodeWorker } from 'node:worker_threads'\n\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionState } from '../client.types.js'\nimport { SerializedError } from './errors.js'\n\nexport type WorkerInboundMessage =\n | {\n type: 'invoke'\n id: number\n target: 'custom' | 'client' | 'storage' | 'storage-self' | 'storage-peers' | 'app-config'\n method: string\n args: SerializedResult<unknown[]>\n void: boolean\n withAbort: boolean\n }\n | {\n type: 'abort'\n id: number\n }\n\nexport type WorkerOutboundMessage =\n | { type: 'server_update'; update: SerializedResult<tl.TypeUpdates> }\n | {\n type: 'update'\n update: SerializedResult<tl.TypeUpdate>\n users: SerializedResult<Map<number, tl.TypeUser>>\n chats: SerializedResult<Map<number, tl.TypeChat>>\n hasMin: boolean\n }\n | { type: 'error'; error: unknown }\n | { type: 'stop' }\n | { type: 'conn_state'; state: ConnectionState }\n | {\n type: 'log'\n color: number\n level: number\n tag: string\n fmt: string\n args: unknown[]\n }\n | {\n type: 'result'\n id: number\n result?: SerializedResult<unknown>\n error?: SerializedError\n }\n\nexport type SomeWorker = NodeWorker | Worker | SharedWorker\n\nexport type SendFn = (message: WorkerInboundMessage) => void\nexport type ClientMessageHandler = (message: WorkerOutboundMessage) => void\n\nexport type RespondFn = (message: WorkerOutboundMessage) => void\nexport type WorkerMessageHandler = (message: WorkerInboundMessage, respond: RespondFn) => void\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WorkerCustomMethods = Record<string, (...args: any[]) => Promise<any>>\n\nexport type SerializedResult<T> = { __serialized__: T }\n\nexport function serializeResult<T>(result: T): SerializedResult<T> {\n if (ArrayBuffer.isView(result)) return result as unknown as SerializedResult<T>\n\n if (Array.isArray(result)) {\n return result.map(serializeResult) as unknown as SerializedResult<T>\n }\n\n if (result instanceof Map) {\n for (const [key, value] of result.entries()) {\n result.set(key, serializeResult(value))\n }\n\n return result as unknown as SerializedResult<T>\n }\n\n if (result && typeof result === 'object') {\n // replace Long instances with a special object\n const newResult: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(result)) {\n if (Long.isLong(value)) {\n // eslint-disable-next-line\n newResult[key] = {\n __type: 'long',\n low: value.low,\n high: value.high,\n unsigned: value.unsigned,\n }\n } else if (typeof value === 'object') {\n // eslint-disable-next-line\n newResult[key] = serializeResult(value)\n } else {\n newResult[key] = value\n }\n }\n\n return newResult as unknown as SerializedResult<T>\n }\n\n return result as unknown as SerializedResult<T>\n}\n\nexport function deserializeResult<T>(result: SerializedResult<T>): T {\n if (ArrayBuffer.isView(result)) return result as unknown as T\n\n if (Array.isArray(result)) {\n return result.map(deserializeResult) as unknown as T\n }\n\n if (result instanceof Map) {\n for (const [key, value] of result.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n result.set(key, deserializeResult(value))\n }\n\n return result as unknown as T\n }\n\n if (result && typeof result === 'object') {\n for (const [key, value] of Object.entries(result)) {\n if (value && typeof value === 'object' && (value as Record<string, string>).__type === 'long') {\n // eslint-disable-next-line\n ;(result as any)[key] = Long.fromValue(value as unknown as Long)\n } else if (typeof value === 'object') {\n // eslint-disable-next-line\n ;(result as any)[key] = deserializeResult(value as SerializedResult<unknown>)\n }\n }\n }\n\n return result as unknown as T\n}\n"]}
@@ -259,7 +259,7 @@ class NetworkManager {
259
259
  _: 'initConnection',
260
260
  deviceModel,
261
261
  systemVersion: '1.0',
262
- appVersion: '0.16.3',
262
+ appVersion: '0.16.6',
263
263
  systemLangCode: 'en',
264
264
  langPack: '', // "langPacks are for official apps only"
265
265
  langCode: 'en',
@@ -41,6 +41,10 @@ export async function findDialogs(client, peers) {
41
41
  foundInputPeers.push(resolvedPeer);
42
42
  foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i);
43
43
  }
44
+ if (foundInputPeers.length === 0) {
45
+ // we didn't find anything, we can't even fetch the dialogs
46
+ throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${peers.join(', ')}`);
47
+ }
44
48
  const dialogs = await getPeerDialogs(client, foundInputPeers);
45
49
  if (foundInputPeers.length === peers.length) {
46
50
  return dialogs;
@@ -1 +1 @@
1
- {"version":3,"file":"find-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/find-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MaybeArray } from '../../../types/utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { Dialog } from '../../types/messages/dialog.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\nimport { getPeerDialogs } from './get-peer-dialogs.js'\nimport { iterDialogs } from './iter-dialogs.js'\n\n// @available=user\n/**\n * Try to find a dialog (dialogs) with a given peer (peers) by their ID, username or phone number.\n *\n * This might be an expensive call, as it will potentially iterate over all\n * dialogs to find the one with the given peer\n *\n * @throws {MtPeerNotFoundError} If a dialog with any of the given peers was not found\n */\nexport async function findDialogs(client: ITelegramClient, peers: MaybeArray<string | number>): Promise<Dialog[]> {\n if (!Array.isArray(peers)) peers = [peers]\n const resolved = await resolvePeerMany(client, peers)\n\n // now we need to split `peers` into two parts: ids that we could resolve and those we couldn't\n // those that we couldn't we'll iterate over all dialogs and try to find them by username/id\n // those that we could we'll use getPeerDialogs\n\n // id -> idx\n const notFoundIds = new Map<number, number>()\n // username -> idx\n const notFoundUsernames = new Map<string, number>()\n let notFoundCount = 0\n\n const foundInputPeers: tl.TypeInputPeer[] = []\n const foundIdxToOriginalIdx = new Map<number, number>()\n\n for (let i = 0; i < peers.length; i++) {\n const input = peers[i]\n const resolvedPeer = resolved[i]\n\n if (!resolvedPeer) {\n if (typeof input === 'number') {\n notFoundIds.set(input, i)\n } else {\n notFoundUsernames.set(input, i)\n }\n\n notFoundCount += 1\n\n continue\n }\n\n foundInputPeers.push(resolvedPeer)\n foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i)\n }\n\n const dialogs = await getPeerDialogs(client, foundInputPeers)\n\n if (foundInputPeers.length === peers.length) {\n return dialogs\n }\n\n const ret = new Array<Dialog>(peers.length)\n\n // populate found dialogs\n for (const [idx, origIdx] of foundIdxToOriginalIdx) {\n ret[origIdx] = dialogs[idx]\n }\n\n // now we need to iterate over all dialogs and try to find the rest\n for await (const dialog of iterDialogs(client, {\n archived: 'keep',\n })) {\n const chat = dialog.chat\n\n const idxById = notFoundIds.get(chat.id)\n\n if (idxById !== undefined) {\n ret[idxById] = dialog\n notFoundIds.delete(chat.id)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n\n if (!chat.username) continue\n\n const idxByUsername = notFoundUsernames.get(chat.username)\n\n if (idxByUsername !== undefined) {\n ret[idxByUsername] = dialog\n notFoundUsernames.delete(chat.username)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n }\n\n // if we still have some dialogs that we couldn't find, fail\n\n if (notFoundCount > 0) {\n const notFound = [...notFoundIds.keys(), ...notFoundUsernames.keys()]\n throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${notFound.join(', ')}`)\n }\n\n return ret\n}\n"]}
1
+ {"version":3,"file":"find-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/find-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MaybeArray } from '../../../types/utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { Dialog } from '../../types/messages/dialog.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\nimport { getPeerDialogs } from './get-peer-dialogs.js'\nimport { iterDialogs } from './iter-dialogs.js'\n\n// @available=user\n/**\n * Try to find a dialog (dialogs) with a given peer (peers) by their ID, username or phone number.\n *\n * This might be an expensive call, as it will potentially iterate over all\n * dialogs to find the one with the given peer\n *\n * @throws {MtPeerNotFoundError} If a dialog with any of the given peers was not found\n */\nexport async function findDialogs(client: ITelegramClient, peers: MaybeArray<string | number>): Promise<Dialog[]> {\n if (!Array.isArray(peers)) peers = [peers]\n const resolved = await resolvePeerMany(client, peers)\n\n // now we need to split `peers` into two parts: ids that we could resolve and those we couldn't\n // those that we couldn't we'll iterate over all dialogs and try to find them by username/id\n // those that we could we'll use getPeerDialogs\n\n // id -> idx\n const notFoundIds = new Map<number, number>()\n // username -> idx\n const notFoundUsernames = new Map<string, number>()\n let notFoundCount = 0\n\n const foundInputPeers: tl.TypeInputPeer[] = []\n const foundIdxToOriginalIdx = new Map<number, number>()\n\n for (let i = 0; i < peers.length; i++) {\n const input = peers[i]\n const resolvedPeer = resolved[i]\n\n if (!resolvedPeer) {\n if (typeof input === 'number') {\n notFoundIds.set(input, i)\n } else {\n notFoundUsernames.set(input, i)\n }\n\n notFoundCount += 1\n\n continue\n }\n\n foundInputPeers.push(resolvedPeer)\n foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i)\n }\n\n if (foundInputPeers.length === 0) {\n // we didn't find anything, we can't even fetch the dialogs\n throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${peers.join(', ')}`)\n }\n\n const dialogs = await getPeerDialogs(client, foundInputPeers)\n\n if (foundInputPeers.length === peers.length) {\n return dialogs\n }\n\n const ret = new Array<Dialog>(peers.length)\n\n // populate found dialogs\n for (const [idx, origIdx] of foundIdxToOriginalIdx) {\n ret[origIdx] = dialogs[idx]\n }\n\n // now we need to iterate over all dialogs and try to find the rest\n for await (const dialog of iterDialogs(client, {\n archived: 'keep',\n })) {\n const chat = dialog.chat\n\n const idxById = notFoundIds.get(chat.id)\n\n if (idxById !== undefined) {\n ret[idxById] = dialog\n notFoundIds.delete(chat.id)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n\n if (!chat.username) continue\n\n const idxByUsername = notFoundUsernames.get(chat.username)\n\n if (idxByUsername !== undefined) {\n ret[idxByUsername] = dialog\n notFoundUsernames.delete(chat.username)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n }\n\n // if we still have some dialogs that we couldn't find, fail\n\n if (notFoundCount > 0) {\n const notFound = [...notFoundIds.keys(), ...notFoundUsernames.keys()]\n throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${notFound.join(', ')}`)\n }\n\n return ret\n}\n"]}
@@ -62,11 +62,23 @@ class Thumbnail extends FileLocation {
62
62
  width = height = NaN;
63
63
  size = location.length;
64
64
  break;
65
- case 'photoPathSize': // lazily
66
- location = () => svgPathToFile(this._path);
67
- width = height = NaN;
65
+ case 'photoPathSize': {
66
+ // try to find documentAttributeImageSize
67
+ const imageSize = media._ === 'document' ?
68
+ media.attributes.find((it) => it._ === 'documentAttributeImageSize') :
69
+ undefined;
70
+ // lazily
71
+ location = () => svgPathToFile(this._path, imageSize);
72
+ if (imageSize) {
73
+ width = imageSize.w;
74
+ height = imageSize.h;
75
+ }
76
+ else {
77
+ width = height = 512;
78
+ }
68
79
  size = Infinity; // this doesn't really matter
69
80
  break;
81
+ }
70
82
  case 'videoSizeEmojiMarkup':
71
83
  case 'videoSizeStickerMarkup':
72
84
  location = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"thumbnail.js","sourceRoot":"","sources":["../../../../../src/highlevel/types/media/thumbnail.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id'\nimport { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { MtArgumentError, MtTypeAssertionError } from '../../../types/errors.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { inflateSvgPath, strippedPhotoToJpg, svgPathToFile } from '../../utils/file-utils.js'\nimport { makeInspectable } from '../../utils/index.js'\nimport { memoizeGetters } from '../../utils/memoize.js'\nimport { FileLocation } from '../files/index.js'\n\n/**\n * One size of some thumbnail\n */\nexport class Thumbnail extends FileLocation {\n // see: https://core.telegram.org/api/files#image-thumbnail-types\n static readonly THUMB_100x100_BOX = 's'\n static readonly THUMB_320x320_BOX = 'm'\n static readonly THUMB_800x800_BOX = 'x'\n static readonly THUMB_1280x1280_BOX = 'y'\n static readonly THUMB_2560x2560_BOX = 'w'\n\n static readonly THUMB_160x160_CROP = 'a'\n static readonly THUMB_320x320_CROP = 'b'\n static readonly THUMB_640x640_CROP = 'c'\n static readonly THUMB_1280x1280_CROP = 'd'\n\n static readonly THUMB_STRIP = 'i'\n static readonly THUMB_OUTLINE = 'j'\n\n /** Animated profile pictures preview */\n static readonly THUMB_VIDEO_PROFILE = 'u'\n /** Trimmed and downscaled video previews */\n static readonly THUMB_VIDEO_PREVIEW = 'v'\n /** Fullscreen animation for Premium stickers */\n static readonly THUMB_VIDEO_FULLSCREEN = 'f'\n\n /** (non-standard) Emoji-based markup for profile photo */\n static readonly THUMB_EMOJI_MARKUP = 'pfp_em'\n /** (non-standard) Sticker-based markup for profile photo */\n static readonly THUMB_STICKER_MARKUP = 'pfp_st'\n\n readonly raw: tl.TypePhotoSize | tl.TypeVideoSize\n\n /**\n * Thumbnail width\n * (`NaN` for {@link THUMB_OUTLINE} and {@link THUMB_STRIP})\n */\n readonly width: number\n\n /**\n * Thumbnail height\n * (`NaN` for {@link THUMB_OUTLINE} and {@link THUMB_STRIP})\n */\n readonly height: number\n\n private _path?: string\n private _media: tl.RawPhoto | tl.RawDocument | tl.RawStickerSet | tl.RawMessageExtendedMediaPreview\n\n constructor(\n media: tl.RawPhoto | tl.RawDocument | tl.RawStickerSet | tl.RawMessageExtendedMediaPreview,\n sz: tl.TypePhotoSize | tl.TypeVideoSize,\n ) {\n switch (sz._) {\n case 'photoSizeEmpty':\n case 'photoCachedSize':\n throw new MtTypeAssertionError('sz', 'not (photoSizeEmpty | photoCachedSize)', sz._)\n }\n\n let location: tl.TypeInputFileLocation | Uint8Array | (() => tl.TypeInputFileLocation | Uint8Array)\n let size\n let width\n let height: number\n\n switch (sz._) {\n case 'photoStrippedSize':\n location = strippedPhotoToJpg(sz.bytes)\n width = height = NaN\n size = location.length\n break\n case 'photoPathSize': // lazily\n location = () => svgPathToFile(this._path!)\n width = height = NaN\n size = Infinity // this doesn't really matter\n break\n case 'videoSizeEmojiMarkup':\n case 'videoSizeStickerMarkup':\n location = () => {\n throw new MtArgumentError('Cannot download thumbnail with emoji/sticker markup, try other size')\n }\n width = height = NaN\n size = Infinity\n break\n default:\n if (media._ === 'stickerSet') {\n location = {\n _: 'inputStickerSetThumb',\n stickerset: {\n _: 'inputStickerSetID',\n id: media.id,\n accessHash: media.accessHash,\n },\n thumbVersion: media.thumbVersion!,\n }\n } else if (media._ === 'messageExtendedMediaPreview') {\n // according to tdlib and tdesktop sources, sz can only be photoStrippedSize\n throw new MtTypeAssertionError('messageExtendedMediaPreview#thumb', 'photoStrippedSize', sz._)\n } else {\n location = {\n _: media._ === 'photo' ? 'inputPhotoFileLocation' : 'inputDocumentFileLocation',\n id: media.id,\n fileReference: media.fileReference,\n accessHash: media.accessHash,\n thumbSize: sz.type,\n }\n }\n width = sz.w\n height = sz.h\n size = sz._ === 'photoSizeProgressive' ? Math.max(...sz.sizes) : sz.size\n break\n }\n\n let dcId: number | undefined\n\n if (media._ === 'stickerSet') {\n dcId = media.thumbDcId\n } else if (media._ === 'messageExtendedMediaPreview') {\n dcId = 0\n } else {\n dcId = media.dcId\n }\n\n super(location, size, dcId)\n this.raw = sz\n this.width = width\n this.height = height\n this._media = media\n\n if (sz._ === 'photoPathSize') {\n this._path = inflateSvgPath(sz.bytes)\n }\n }\n\n get isVideo(): boolean {\n return this.raw._ === 'videoSize'\n }\n\n /**\n * Thumbnail type\n */\n get type(): string {\n if (this.raw._ === 'videoSizeEmojiMarkup') {\n return Thumbnail.THUMB_EMOJI_MARKUP\n }\n if (this.raw._ === 'videoSizeStickerMarkup') {\n return Thumbnail.THUMB_STICKER_MARKUP\n }\n\n return this.raw.type\n }\n\n /**\n * If {@link raw} is `tl.RawPhotoPathSize` (i.e. `raw.type === Thumbnail.THUMB_OUTLINE`),\n * this property will return raw SVG path of the preview.\n *\n * When downloading path thumbnails, a valid SVG file is returned.\n *\n * See also: https://core.telegram.org/api/files#vector-thumbnails\n *\n * @throws MtTypeAssertionError In case {@link raw} is not `tl.RawPhotoPathSize`\n */\n get path(): string {\n assertTypeIs('Thumbnail#path', this.raw, 'photoPathSize')\n\n return this._path!\n }\n\n /**\n * Get TDLib and Bot API compatible File ID\n * representing this thumbnail.\n *\n * > **Note:** You can't use this file id to send a thumbnail,\n * > only to download it.\n */\n get fileId(): string {\n if (\n (this.raw._ !== 'photoSize' && this.raw._ !== 'photoSizeProgressive' && this.raw._ !== 'videoSize') ||\n this._media._ === 'messageExtendedMediaPreview' // just for type safety\n ) {\n throw new MtArgumentError(`Cannot generate a file ID for \"${this.type}\"`)\n }\n\n if (this._media._ === 'stickerSet') {\n return toFileId(getPlatform(), {\n type: td.FileType.Thumbnail,\n dcId: this.dcId!,\n fileReference: null,\n location: {\n _: 'photo',\n id: Long.ZERO,\n accessHash: Long.ZERO,\n source: {\n _: 'stickerSetThumbnailVersion',\n id: this._media.id,\n accessHash: this._media.accessHash,\n version: this._media.thumbVersion!,\n },\n },\n })\n }\n\n return toFileId(getPlatform(), {\n type: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n dcId: this.dcId!,\n fileReference: this._media.fileReference,\n location: {\n _: 'photo',\n id: this._media.id,\n accessHash: this._media.accessHash,\n source: {\n _: 'thumbnail',\n fileType: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n thumbnailType: this.raw.type === 'u' ? '\\x00' : this.raw.type,\n },\n },\n })\n }\n\n /**\n * Get a unique File ID representing this thumbnail.\n */\n get uniqueFileId(): string {\n if (\n (this.raw._ !== 'photoSize' && this.raw._ !== 'photoSizeProgressive' && this.raw._ !== 'videoSize') ||\n this._media._ === 'messageExtendedMediaPreview' // just for type safety\n ) {\n throw new MtArgumentError(`Cannot generate a unique file ID for \"${this.type}\"`)\n }\n\n if (this._media._ === 'stickerSet') {\n return toUniqueFileId(getPlatform(), td.FileType.Thumbnail, {\n _: 'photo',\n id: Long.ZERO,\n source: {\n _: 'stickerSetThumbnailVersion',\n id: this._media.id,\n accessHash: this._media.accessHash,\n version: this._media.thumbVersion!,\n },\n })\n }\n\n return toUniqueFileId(getPlatform(), this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail, {\n _: 'photo',\n id: this._media.id,\n source: {\n _: 'thumbnail',\n fileType: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n thumbnailType: this.raw.type === 'u' ? '\\x00' : this.raw.type,\n },\n })\n }\n}\n\nmemoizeGetters(Thumbnail, ['fileId', 'uniqueFileId'])\nmakeInspectable(Thumbnail, ['fileSize', 'dcId', 'width', 'height'], ['path'])\n"]}
1
+ {"version":3,"file":"thumbnail.js","sourceRoot":"","sources":["../../../../../src/highlevel/types/media/thumbnail.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport { tdFileId as td, toFileId, toUniqueFileId } from '@mtcute/file-id'\nimport { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { MtArgumentError, MtTypeAssertionError } from '../../../types/errors.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { inflateSvgPath, strippedPhotoToJpg, svgPathToFile } from '../../utils/file-utils.js'\nimport { makeInspectable } from '../../utils/index.js'\nimport { memoizeGetters } from '../../utils/memoize.js'\nimport { FileLocation } from '../files/index.js'\n\n/**\n * One size of some thumbnail\n */\nexport class Thumbnail extends FileLocation {\n // see: https://core.telegram.org/api/files#image-thumbnail-types\n static readonly THUMB_100x100_BOX = 's'\n static readonly THUMB_320x320_BOX = 'm'\n static readonly THUMB_800x800_BOX = 'x'\n static readonly THUMB_1280x1280_BOX = 'y'\n static readonly THUMB_2560x2560_BOX = 'w'\n\n static readonly THUMB_160x160_CROP = 'a'\n static readonly THUMB_320x320_CROP = 'b'\n static readonly THUMB_640x640_CROP = 'c'\n static readonly THUMB_1280x1280_CROP = 'd'\n\n static readonly THUMB_STRIP = 'i'\n static readonly THUMB_OUTLINE = 'j'\n\n /** Animated profile pictures preview */\n static readonly THUMB_VIDEO_PROFILE = 'u'\n /** Trimmed and downscaled video previews */\n static readonly THUMB_VIDEO_PREVIEW = 'v'\n /** Fullscreen animation for Premium stickers */\n static readonly THUMB_VIDEO_FULLSCREEN = 'f'\n\n /** (non-standard) Emoji-based markup for profile photo */\n static readonly THUMB_EMOJI_MARKUP = 'pfp_em'\n /** (non-standard) Sticker-based markup for profile photo */\n static readonly THUMB_STICKER_MARKUP = 'pfp_st'\n\n readonly raw: tl.TypePhotoSize | tl.TypeVideoSize\n\n /**\n * Thumbnail width\n * (`NaN` for {@link THUMB_OUTLINE} and {@link THUMB_STRIP})\n */\n readonly width: number\n\n /**\n * Thumbnail height\n * (`NaN` for {@link THUMB_OUTLINE} and {@link THUMB_STRIP})\n */\n readonly height: number\n\n private _path?: string\n private _media: tl.RawPhoto | tl.RawDocument | tl.RawStickerSet | tl.RawMessageExtendedMediaPreview\n\n constructor(\n media: tl.RawPhoto | tl.RawDocument | tl.RawStickerSet | tl.RawMessageExtendedMediaPreview,\n sz: tl.TypePhotoSize | tl.TypeVideoSize,\n ) {\n switch (sz._) {\n case 'photoSizeEmpty':\n case 'photoCachedSize':\n throw new MtTypeAssertionError('sz', 'not (photoSizeEmpty | photoCachedSize)', sz._)\n }\n\n let location: tl.TypeInputFileLocation | Uint8Array | (() => tl.TypeInputFileLocation | Uint8Array)\n let size\n let width\n let height: number\n\n switch (sz._) {\n case 'photoStrippedSize':\n location = strippedPhotoToJpg(sz.bytes)\n width = height = NaN\n size = location.length\n break\n case 'photoPathSize': {\n // try to find documentAttributeImageSize\n const imageSize = media._ === 'document' ?\n media.attributes.find((it) => it._ === 'documentAttributeImageSize') as tl.RawDocumentAttributeImageSize :\n undefined\n // lazily\n location = () => svgPathToFile(this._path!, imageSize)\n\n if (imageSize) {\n width = imageSize.w\n height = imageSize.h\n } else {\n width = height = 512\n }\n size = Infinity // this doesn't really matter\n break\n }\n case 'videoSizeEmojiMarkup':\n case 'videoSizeStickerMarkup':\n location = () => {\n throw new MtArgumentError('Cannot download thumbnail with emoji/sticker markup, try other size')\n }\n width = height = NaN\n size = Infinity\n break\n default:\n if (media._ === 'stickerSet') {\n location = {\n _: 'inputStickerSetThumb',\n stickerset: {\n _: 'inputStickerSetID',\n id: media.id,\n accessHash: media.accessHash,\n },\n thumbVersion: media.thumbVersion!,\n }\n } else if (media._ === 'messageExtendedMediaPreview') {\n // according to tdlib and tdesktop sources, sz can only be photoStrippedSize\n throw new MtTypeAssertionError('messageExtendedMediaPreview#thumb', 'photoStrippedSize', sz._)\n } else {\n location = {\n _: media._ === 'photo' ? 'inputPhotoFileLocation' : 'inputDocumentFileLocation',\n id: media.id,\n fileReference: media.fileReference,\n accessHash: media.accessHash,\n thumbSize: sz.type,\n }\n }\n width = sz.w\n height = sz.h\n size = sz._ === 'photoSizeProgressive' ? Math.max(...sz.sizes) : sz.size\n break\n }\n\n let dcId: number | undefined\n\n if (media._ === 'stickerSet') {\n dcId = media.thumbDcId\n } else if (media._ === 'messageExtendedMediaPreview') {\n dcId = 0\n } else {\n dcId = media.dcId\n }\n\n super(location, size, dcId)\n this.raw = sz\n this.width = width\n this.height = height\n this._media = media\n\n if (sz._ === 'photoPathSize') {\n this._path = inflateSvgPath(sz.bytes)\n }\n }\n\n get isVideo(): boolean {\n return this.raw._ === 'videoSize'\n }\n\n /**\n * Thumbnail type\n */\n get type(): string {\n if (this.raw._ === 'videoSizeEmojiMarkup') {\n return Thumbnail.THUMB_EMOJI_MARKUP\n }\n if (this.raw._ === 'videoSizeStickerMarkup') {\n return Thumbnail.THUMB_STICKER_MARKUP\n }\n\n return this.raw.type\n }\n\n /**\n * If {@link raw} is `tl.RawPhotoPathSize` (i.e. `raw.type === Thumbnail.THUMB_OUTLINE`),\n * this property will return raw SVG path of the preview.\n *\n * When downloading path thumbnails, a valid SVG file is returned.\n *\n * See also: https://core.telegram.org/api/files#vector-thumbnails\n *\n * @throws MtTypeAssertionError In case {@link raw} is not `tl.RawPhotoPathSize`\n */\n get path(): string {\n assertTypeIs('Thumbnail#path', this.raw, 'photoPathSize')\n\n return this._path!\n }\n\n /**\n * Get TDLib and Bot API compatible File ID\n * representing this thumbnail.\n *\n * > **Note:** You can't use this file id to send a thumbnail,\n * > only to download it.\n */\n get fileId(): string {\n if (\n (this.raw._ !== 'photoSize' && this.raw._ !== 'photoSizeProgressive' && this.raw._ !== 'videoSize') ||\n this._media._ === 'messageExtendedMediaPreview' // just for type safety\n ) {\n throw new MtArgumentError(`Cannot generate a file ID for \"${this.type}\"`)\n }\n\n if (this._media._ === 'stickerSet') {\n return toFileId(getPlatform(), {\n type: td.FileType.Thumbnail,\n dcId: this.dcId!,\n fileReference: null,\n location: {\n _: 'photo',\n id: Long.ZERO,\n accessHash: Long.ZERO,\n source: {\n _: 'stickerSetThumbnailVersion',\n id: this._media.id,\n accessHash: this._media.accessHash,\n version: this._media.thumbVersion!,\n },\n },\n })\n }\n\n return toFileId(getPlatform(), {\n type: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n dcId: this.dcId!,\n fileReference: this._media.fileReference,\n location: {\n _: 'photo',\n id: this._media.id,\n accessHash: this._media.accessHash,\n source: {\n _: 'thumbnail',\n fileType: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n thumbnailType: this.raw.type === 'u' ? '\\x00' : this.raw.type,\n },\n },\n })\n }\n\n /**\n * Get a unique File ID representing this thumbnail.\n */\n get uniqueFileId(): string {\n if (\n (this.raw._ !== 'photoSize' && this.raw._ !== 'photoSizeProgressive' && this.raw._ !== 'videoSize') ||\n this._media._ === 'messageExtendedMediaPreview' // just for type safety\n ) {\n throw new MtArgumentError(`Cannot generate a unique file ID for \"${this.type}\"`)\n }\n\n if (this._media._ === 'stickerSet') {\n return toUniqueFileId(getPlatform(), td.FileType.Thumbnail, {\n _: 'photo',\n id: Long.ZERO,\n source: {\n _: 'stickerSetThumbnailVersion',\n id: this._media.id,\n accessHash: this._media.accessHash,\n version: this._media.thumbVersion!,\n },\n })\n }\n\n return toUniqueFileId(getPlatform(), this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail, {\n _: 'photo',\n id: this._media.id,\n source: {\n _: 'thumbnail',\n fileType: this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail,\n thumbnailType: this.raw.type === 'u' ? '\\x00' : this.raw.type,\n },\n })\n }\n}\n\nmemoizeGetters(Thumbnail, ['fileId', 'uniqueFileId'])\nmakeInspectable(Thumbnail, ['fileSize', 'dcId', 'width', 'height'], ['path'])\n"]}
@@ -1,3 +1,4 @@
1
+ import { tl } from '@mtcute/tl';
1
2
  /**
2
3
  * Given file size, determine the appropriate chunk size (in KB)
3
4
  * for upload/download operations.
@@ -18,9 +19,10 @@ export declare function strippedPhotoToJpg(stripped: Uint8Array): Uint8Array;
18
19
  export declare function inflateSvgPath(encoded: Uint8Array): string;
19
20
  /**
20
21
  * Convert SVG path to SVG file
21
- * @param path
22
+ * @param path SVG path
23
+ * @param size Size attribute of the document, if available
22
24
  */
23
- export declare function svgPathToFile(path: string): Uint8Array;
25
+ export declare function svgPathToFile(path: string, size?: tl.RawDocumentAttributeImageSize): Uint8Array;
24
26
  /**
25
27
  * Get file name from file path
26
28
  *
@@ -90,12 +90,13 @@ export function inflateSvgPath(encoded) {
90
90
  }
91
91
  /**
92
92
  * Convert SVG path to SVG file
93
- * @param path
93
+ * @param path SVG path
94
+ * @param size Size attribute of the document, if available
94
95
  */
95
- export function svgPathToFile(path) {
96
+ export function svgPathToFile(path, size) {
96
97
  return getPlatform().utf8Encode('<?xml version="1.0" encoding="utf-8"?>' +
97
98
  '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"' +
98
- 'viewBox="0 0 512 512" xml:space="preserve">' +
99
+ `viewBox="0 0 ${size?.w ?? 512} ${size?.h ?? 512}" xml:space="preserve">` +
99
100
  '<path d="' +
100
101
  path +
101
102
  '"/>' +
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/file-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPlatform } from '../../platform.js'\nimport { MtArgumentError } from '../../types/errors.js'\nimport { concatBuffers } from '../../utils/buffer-utils.js'\n\n/**\n * Given file size, determine the appropriate chunk size (in KB)\n * for upload/download operations.\n */\nexport function determinePartSize(fileSize: number): number {\n if (fileSize <= 262078465) return 128 // 200 MB\n if (fileSize <= 786432000) return 256 // 750 MB\n if (fileSize <= 2097152000) return 512 // 2000 MB\n\n throw new MtArgumentError('File is too large')\n}\n\n/**\n * Returns `true` if all bytes in `buf` are printable ASCII characters\n */\nexport function isProbablyPlainText(buf: Uint8Array): boolean {\n return !buf.some(\n (it) =>\n !(\n (\n (it >= 0x20 && it < 0x7f) || // printable ascii range\n it === 0x0d || // CR\n it === 0x0a || // LF\n it === 0x09\n ) // Tab\n ),\n )\n}\n\n// from https://github.com/telegramdesktop/tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225\nconst JPEG_HEADER = () =>\n getPlatform().hexDecode(\n 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e1928' +\n '2321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aad' +\n 'aad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c35' +\n '3c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f' +\n '8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc0001108000000' +\n '0003012200021101031101ffc4001f0000010501010101010100000000000000000' +\n '102030405060708090a0bffc400b5100002010303020403050504040000017d0102' +\n '0300041105122131410613516107227114328191a1082342b1c11552d1f02433627' +\n '282090a161718191a25262728292a3435363738393a434445464748494a53545556' +\n '5758595a636465666768696a737475767778797a838485868788898a92939495969' +\n '798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4' +\n 'd5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030' +\n '101010101010101010000000000000102030405060708090a0bffc400b511000201' +\n '0204040304070504040001027700010203110405213106124151076171132232810' +\n '8144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a3536' +\n '3738393a434445464748494a535455565758595a636465666768696a73747576777' +\n '8797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5' +\n 'b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f' +\n '3f4f5f6f7f8f9faffda000c03010002110311003f00',\n )\nlet JPEG_HEADER_BYTES: Uint8Array | null = null\nconst JPEG_FOOTER = new Uint8Array([0xff, 0xd9])\n\n/**\n * Convert stripped JPEG (from `photoStrippedSize`) to full JPEG\n */\nexport function strippedPhotoToJpg(stripped: Uint8Array): Uint8Array {\n if (stripped.length < 3 || stripped[0] !== 1) {\n throw new MtArgumentError('Invalid stripped JPEG')\n }\n\n if (JPEG_HEADER_BYTES === null) {\n JPEG_HEADER_BYTES = JPEG_HEADER()\n }\n\n const result = concatBuffers([JPEG_HEADER_BYTES, stripped.slice(3), JPEG_FOOTER])\n result[164] = stripped[1]\n result[166] = stripped[2]\n\n return result\n}\n\nconst SVG_LOOKUP = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,'\n\n/**\n * Inflate compressed preview SVG path to full SVG path\n * @param encoded\n */\nexport function inflateSvgPath(encoded: Uint8Array): string {\n let path = 'M'\n const len = encoded.length\n\n for (let i = 0; i < len; i++) {\n const num = encoded[i]\n\n if (num >= 192) {\n // 128 + 64\n path += SVG_LOOKUP[num - 192]\n } else {\n if (num >= 128) {\n path += ','\n } else if (num >= 64) {\n path += '-'\n }\n\n path += num & 63\n }\n }\n\n path += 'z'\n\n return path\n}\n\n/**\n * Convert SVG path to SVG file\n * @param path\n */\nexport function svgPathToFile(path: string): Uint8Array {\n return getPlatform().utf8Encode(\n '<?xml version=\"1.0\" encoding=\"utf-8\"?>' +\n '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"' +\n 'viewBox=\"0 0 512 512\" xml:space=\"preserve\">' +\n '<path d=\"' +\n path +\n '\"/>' +\n '</svg>',\n )\n}\n\n/**\n * Get file name from file path\n *\n * @param path File path\n */\nexport function extractFileName(path: string): string {\n if (path.startsWith('file:')) path = path.slice(5)\n\n return path.split(/[\\\\/]/).pop()!.split('?')[0]\n}\n"]}
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/file-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../platform.js'\nimport { MtArgumentError } from '../../types/errors.js'\nimport { concatBuffers } from '../../utils/buffer-utils.js'\n\n/**\n * Given file size, determine the appropriate chunk size (in KB)\n * for upload/download operations.\n */\nexport function determinePartSize(fileSize: number): number {\n if (fileSize <= 262078465) return 128 // 200 MB\n if (fileSize <= 786432000) return 256 // 750 MB\n if (fileSize <= 2097152000) return 512 // 2000 MB\n\n throw new MtArgumentError('File is too large')\n}\n\n/**\n * Returns `true` if all bytes in `buf` are printable ASCII characters\n */\nexport function isProbablyPlainText(buf: Uint8Array): boolean {\n return !buf.some(\n (it) =>\n !(\n (\n (it >= 0x20 && it < 0x7f) || // printable ascii range\n it === 0x0d || // CR\n it === 0x0a || // LF\n it === 0x09\n ) // Tab\n ),\n )\n}\n\n// from https://github.com/telegramdesktop/tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225\nconst JPEG_HEADER = () =>\n getPlatform().hexDecode(\n 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e1928' +\n '2321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aad' +\n 'aad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c35' +\n '3c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f' +\n '8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc0001108000000' +\n '0003012200021101031101ffc4001f0000010501010101010100000000000000000' +\n '102030405060708090a0bffc400b5100002010303020403050504040000017d0102' +\n '0300041105122131410613516107227114328191a1082342b1c11552d1f02433627' +\n '282090a161718191a25262728292a3435363738393a434445464748494a53545556' +\n '5758595a636465666768696a737475767778797a838485868788898a92939495969' +\n '798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4' +\n 'd5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030' +\n '101010101010101010000000000000102030405060708090a0bffc400b511000201' +\n '0204040304070504040001027700010203110405213106124151076171132232810' +\n '8144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a3536' +\n '3738393a434445464748494a535455565758595a636465666768696a73747576777' +\n '8797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5' +\n 'b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f' +\n '3f4f5f6f7f8f9faffda000c03010002110311003f00',\n )\nlet JPEG_HEADER_BYTES: Uint8Array | null = null\nconst JPEG_FOOTER = new Uint8Array([0xff, 0xd9])\n\n/**\n * Convert stripped JPEG (from `photoStrippedSize`) to full JPEG\n */\nexport function strippedPhotoToJpg(stripped: Uint8Array): Uint8Array {\n if (stripped.length < 3 || stripped[0] !== 1) {\n throw new MtArgumentError('Invalid stripped JPEG')\n }\n\n if (JPEG_HEADER_BYTES === null) {\n JPEG_HEADER_BYTES = JPEG_HEADER()\n }\n\n const result = concatBuffers([JPEG_HEADER_BYTES, stripped.slice(3), JPEG_FOOTER])\n result[164] = stripped[1]\n result[166] = stripped[2]\n\n return result\n}\n\nconst SVG_LOOKUP = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,'\n\n/**\n * Inflate compressed preview SVG path to full SVG path\n * @param encoded\n */\nexport function inflateSvgPath(encoded: Uint8Array): string {\n let path = 'M'\n const len = encoded.length\n\n for (let i = 0; i < len; i++) {\n const num = encoded[i]\n\n if (num >= 192) {\n // 128 + 64\n path += SVG_LOOKUP[num - 192]\n } else {\n if (num >= 128) {\n path += ','\n } else if (num >= 64) {\n path += '-'\n }\n\n path += num & 63\n }\n }\n\n path += 'z'\n\n return path\n}\n\n/**\n * Convert SVG path to SVG file\n * @param path SVG path\n * @param size Size attribute of the document, if available\n */\nexport function svgPathToFile(path: string, size?: tl.RawDocumentAttributeImageSize): Uint8Array {\n return getPlatform().utf8Encode(\n '<?xml version=\"1.0\" encoding=\"utf-8\"?>' +\n '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"' +\n `viewBox=\"0 0 ${size?.w ?? 512} ${size?.h ?? 512}\" xml:space=\"preserve\">` +\n '<path d=\"' +\n path +\n '\"/>' +\n '</svg>',\n )\n}\n\n/**\n * Get file name from file path\n *\n * @param path File path\n */\nexport function extractFileName(path: string): string {\n if (path.startsWith('file:')) path = path.slice(5)\n\n return path.split(/[\\\\/]/).pop()!.split('?')[0]\n}\n"]}
@@ -40,7 +40,7 @@ export function decodeWaveform(wf) {
40
40
  */
41
41
  export function encodeWaveform(wf) {
42
42
  const bitsCount = wf.length * 5;
43
- const bytesCount = ~~(bitsCount + 7) / 8;
43
+ const bytesCount = ~~((bitsCount + 7) / 8);
44
44
  const result = new Uint8Array(bytesCount + 1);
45
45
  const dv = dataViewFromBuffer(result);
46
46
  // Write each 0-31 unsigned char as 5 bit to result.
@@ -1 +1 @@
1
- {"version":3,"file":"voice-utils.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/voice-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { dataViewFromBuffer } from '../../utils/buffer-utils.js'\n\n/**\n * Decode 5-bit encoded voice message waveform into\n * an array of waveform values (0-32).\n *\n * @param wf Encoded waveform\n */\nexport function decodeWaveform(wf: Uint8Array): number[] {\n const bitsCount = wf.length * 8\n const valuesCount = ~~(bitsCount / 5)\n\n if (!valuesCount) return []\n\n const lastIdx = valuesCount - 1\n\n // Read each 5 bit of encoded 5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries except the last one.\n\n const result: number[] = []\n const dv = dataViewFromBuffer(wf)\n\n for (let i = 0, j = 0; i < lastIdx; i++, j += 5) {\n const byteIdx = ~~(j / 8)\n const bitShift = j % 8\n result[i] = (dv.getUint16(byteIdx, true) >> bitShift) & 0b11111\n }\n\n const lastByteIdx = ~~((lastIdx * 5) / 8)\n const lastBitShift = (lastIdx * 5) % 8\n const lastValue = lastByteIdx === wf.length - 1 ? wf[lastByteIdx] : dv.getUint16(lastByteIdx, true)\n result[lastIdx] = (lastValue >> lastBitShift) & 0b11111\n\n return result\n}\n\n/**\n * Encode an array of waveform values into\n * 5-bit encoded voice message waveform into\n *\n * @param wf Waveform values\n */\nexport function encodeWaveform(wf: number[]): Uint8Array {\n const bitsCount = wf.length * 5\n const bytesCount = ~~(bitsCount + 7) / 8\n const result = new Uint8Array(bytesCount + 1)\n const dv = dataViewFromBuffer(result)\n\n // Write each 0-31 unsigned char as 5 bit to result.\n // We reserve one extra byte to be able to dereference any of required bytes\n // as a uint16 without overflowing, even the byte with index \"bytesCount - 1\".\n\n for (let i = 0, j = 0; i < wf.length; i++, j += 5) {\n const byteIdx = ~~(j / 8)\n const bitShift = j % 8\n const value = (wf[i] & 0b11111) << bitShift\n\n // const old = result.readUInt16LE(byteIdx)\n // result.writeUInt16LE(old | value, byteIdx)\n dv.setUint16(byteIdx, dv.getUint16(byteIdx, true) | value, true)\n }\n\n return result.slice(0, bytesCount)\n}\n"]}
1
+ {"version":3,"file":"voice-utils.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/voice-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { dataViewFromBuffer } from '../../utils/buffer-utils.js'\n\n/**\n * Decode 5-bit encoded voice message waveform into\n * an array of waveform values (0-32).\n *\n * @param wf Encoded waveform\n */\nexport function decodeWaveform(wf: Uint8Array): number[] {\n const bitsCount = wf.length * 8\n const valuesCount = ~~(bitsCount / 5)\n\n if (!valuesCount) return []\n\n const lastIdx = valuesCount - 1\n\n // Read each 5 bit of encoded 5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries except the last one.\n\n const result: number[] = []\n const dv = dataViewFromBuffer(wf)\n\n for (let i = 0, j = 0; i < lastIdx; i++, j += 5) {\n const byteIdx = ~~(j / 8)\n const bitShift = j % 8\n result[i] = (dv.getUint16(byteIdx, true) >> bitShift) & 0b11111\n }\n\n const lastByteIdx = ~~((lastIdx * 5) / 8)\n const lastBitShift = (lastIdx * 5) % 8\n const lastValue = lastByteIdx === wf.length - 1 ? wf[lastByteIdx] : dv.getUint16(lastByteIdx, true)\n result[lastIdx] = (lastValue >> lastBitShift) & 0b11111\n\n return result\n}\n\n/**\n * Encode an array of waveform values into\n * 5-bit encoded voice message waveform into\n *\n * @param wf Waveform values\n */\nexport function encodeWaveform(wf: number[]): Uint8Array {\n const bitsCount = wf.length * 5\n const bytesCount = ~~((bitsCount + 7) / 8)\n const result = new Uint8Array(bytesCount + 1)\n const dv = dataViewFromBuffer(result)\n\n // Write each 0-31 unsigned char as 5 bit to result.\n // We reserve one extra byte to be able to dereference any of required bytes\n // as a uint16 without overflowing, even the byte with index \"bytesCount - 1\".\n\n for (let i = 0, j = 0; i < wf.length; i++, j += 5) {\n const byteIdx = ~~(j / 8)\n const bitShift = j % 8\n const value = (wf[i] & 0b11111) << bitShift\n\n // const old = result.readUInt16LE(byteIdx)\n // result.writeUInt16LE(old | value, byteIdx)\n dv.setUint16(byteIdx, dv.getUint16(byteIdx, true) | value, true)\n }\n\n return result.slice(0, bytesCount)\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import Long from 'long';
2
2
  export function serializeResult(result) {
3
+ if (ArrayBuffer.isView(result))
4
+ return result;
3
5
  if (Array.isArray(result)) {
4
6
  return result.map(serializeResult);
5
7
  }
@@ -35,6 +37,8 @@ export function serializeResult(result) {
35
37
  return result;
36
38
  }
37
39
  export function deserializeResult(result) {
40
+ if (ArrayBuffer.isView(result))
41
+ return result;
38
42
  if (Array.isArray(result)) {
39
43
  return result.map(deserializeResult);
40
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AA+DvB,MAAM,UAAU,eAAe,CAAI,MAAS;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,CAAmC,CAAA;IACxE,CAAC;IAED,IAAI,MAAM,YAAY,GAAG,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3C,CAAC;QAED,OAAO,MAAwC,CAAA;IACnD,CAAC;IAED,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvC,+CAA+C;QAC/C,MAAM,SAAS,GAA4B,EAAE,CAAA;QAE7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,2BAA2B;gBAC3B,SAAS,CAAC,GAAG,CAAC,GAAG;oBACb,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBAC3B,CAAA;YACL,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnC,2BAA2B;gBAC3B,SAAS,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;YAC3C,CAAC;iBAAM,CAAC;gBACJ,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YAC1B,CAAC;QACL,CAAC;QAED,OAAO,SAA2C,CAAA;IACtD,CAAC;IAED,OAAO,MAAwC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,MAA2B;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAiB,CAAA;IACxD,CAAC;IAED,IAAI,MAAM,YAAY,GAAG,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,iEAAiE;YACjE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,MAAsB,CAAA;IACjC,CAAC;IAED,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAgC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC5F,2BAA2B;gBAC3B,CAAC;gBAAC,MAAc,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAwB,CAAC,CAAA;YACpE,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnC,2BAA2B;gBAC3B,CAAC;gBAAC,MAAc,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAkC,CAAC,CAAA;YACjF,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAsB,CAAA;AACjC,CAAC","sourcesContent":["import Long from 'long'\nimport type { Worker as NodeWorker } from 'node:worker_threads'\n\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionState } from '../client.types.js'\nimport { SerializedError } from './errors.js'\n\nexport type WorkerInboundMessage =\n | {\n type: 'invoke'\n id: number\n target: 'custom' | 'client' | 'storage' | 'storage-self' | 'storage-peers' | 'app-config'\n method: string\n args: SerializedResult<unknown[]>\n void: boolean\n withAbort: boolean\n }\n | {\n type: 'abort'\n id: number\n }\n\nexport type WorkerOutboundMessage =\n | { type: 'server_update'; update: SerializedResult<tl.TypeUpdates> }\n | {\n type: 'update'\n update: SerializedResult<tl.TypeUpdate>\n users: SerializedResult<Map<number, tl.TypeUser>>\n chats: SerializedResult<Map<number, tl.TypeChat>>\n hasMin: boolean\n }\n | { type: 'error'; error: unknown }\n | { type: 'stop' }\n | { type: 'conn_state'; state: ConnectionState }\n | {\n type: 'log'\n color: number\n level: number\n tag: string\n fmt: string\n args: unknown[]\n }\n | {\n type: 'result'\n id: number\n result?: SerializedResult<unknown>\n error?: SerializedError\n }\n\nexport type SomeWorker = NodeWorker | Worker | SharedWorker\n\nexport type SendFn = (message: WorkerInboundMessage) => void\nexport type ClientMessageHandler = (message: WorkerOutboundMessage) => void\n\nexport type RespondFn = (message: WorkerOutboundMessage) => void\nexport type WorkerMessageHandler = (message: WorkerInboundMessage, respond: RespondFn) => void\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WorkerCustomMethods = Record<string, (...args: any[]) => Promise<any>>\n\nexport type SerializedResult<T> = { __serialized__: T }\n\nexport function serializeResult<T>(result: T): SerializedResult<T> {\n if (Array.isArray(result)) {\n return result.map(serializeResult) as unknown as SerializedResult<T>\n }\n\n if (result instanceof Map) {\n for (const [key, value] of result.entries()) {\n result.set(key, serializeResult(value))\n }\n\n return result as unknown as SerializedResult<T>\n }\n\n if (result && typeof result === 'object') {\n // replace Long instances with a special object\n const newResult: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(result)) {\n if (Long.isLong(value)) {\n // eslint-disable-next-line\n newResult[key] = {\n __type: 'long',\n low: value.low,\n high: value.high,\n unsigned: value.unsigned,\n }\n } else if (typeof value === 'object') {\n // eslint-disable-next-line\n newResult[key] = serializeResult(value)\n } else {\n newResult[key] = value\n }\n }\n\n return newResult as unknown as SerializedResult<T>\n }\n\n return result as unknown as SerializedResult<T>\n}\n\nexport function deserializeResult<T>(result: SerializedResult<T>): T {\n if (Array.isArray(result)) {\n return result.map(deserializeResult) as unknown as T\n }\n\n if (result instanceof Map) {\n for (const [key, value] of result.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n result.set(key, deserializeResult(value))\n }\n\n return result as unknown as T\n }\n\n if (result && typeof result === 'object') {\n for (const [key, value] of Object.entries(result)) {\n if (value && typeof value === 'object' && (value as Record<string, string>).__type === 'long') {\n // eslint-disable-next-line\n ;(result as any)[key] = Long.fromValue(value as unknown as Long)\n } else if (typeof value === 'object') {\n // eslint-disable-next-line\n ;(result as any)[key] = deserializeResult(value as SerializedResult<unknown>)\n }\n }\n }\n\n return result as unknown as T\n}\n"]}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../src/highlevel/worker/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\nimport type { Worker as NodeWorker } from 'node:worker_threads'\n\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionState } from '../client.types.js'\nimport { SerializedError } from './errors.js'\n\nexport type WorkerInboundMessage =\n | {\n type: 'invoke'\n id: number\n target: 'custom' | 'client' | 'storage' | 'storage-self' | 'storage-peers' | 'app-config'\n method: string\n args: SerializedResult<unknown[]>\n void: boolean\n withAbort: boolean\n }\n | {\n type: 'abort'\n id: number\n }\n\nexport type WorkerOutboundMessage =\n | { type: 'server_update'; update: SerializedResult<tl.TypeUpdates> }\n | {\n type: 'update'\n update: SerializedResult<tl.TypeUpdate>\n users: SerializedResult<Map<number, tl.TypeUser>>\n chats: SerializedResult<Map<number, tl.TypeChat>>\n hasMin: boolean\n }\n | { type: 'error'; error: unknown }\n | { type: 'stop' }\n | { type: 'conn_state'; state: ConnectionState }\n | {\n type: 'log'\n color: number\n level: number\n tag: string\n fmt: string\n args: unknown[]\n }\n | {\n type: 'result'\n id: number\n result?: SerializedResult<unknown>\n error?: SerializedError\n }\n\nexport type SomeWorker = NodeWorker | Worker | SharedWorker\n\nexport type SendFn = (message: WorkerInboundMessage) => void\nexport type ClientMessageHandler = (message: WorkerOutboundMessage) => void\n\nexport type RespondFn = (message: WorkerOutboundMessage) => void\nexport type WorkerMessageHandler = (message: WorkerInboundMessage, respond: RespondFn) => void\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WorkerCustomMethods = Record<string, (...args: any[]) => Promise<any>>\n\nexport type SerializedResult<T> = { __serialized__: T }\n\nexport function serializeResult<T>(result: T): SerializedResult<T> {\n if (ArrayBuffer.isView(result)) return result as unknown as SerializedResult<T>\n\n if (Array.isArray(result)) {\n return result.map(serializeResult) as unknown as SerializedResult<T>\n }\n\n if (result instanceof Map) {\n for (const [key, value] of result.entries()) {\n result.set(key, serializeResult(value))\n }\n\n return result as unknown as SerializedResult<T>\n }\n\n if (result && typeof result === 'object') {\n // replace Long instances with a special object\n const newResult: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(result)) {\n if (Long.isLong(value)) {\n // eslint-disable-next-line\n newResult[key] = {\n __type: 'long',\n low: value.low,\n high: value.high,\n unsigned: value.unsigned,\n }\n } else if (typeof value === 'object') {\n // eslint-disable-next-line\n newResult[key] = serializeResult(value)\n } else {\n newResult[key] = value\n }\n }\n\n return newResult as unknown as SerializedResult<T>\n }\n\n return result as unknown as SerializedResult<T>\n}\n\nexport function deserializeResult<T>(result: SerializedResult<T>): T {\n if (ArrayBuffer.isView(result)) return result as unknown as T\n\n if (Array.isArray(result)) {\n return result.map(deserializeResult) as unknown as T\n }\n\n if (result instanceof Map) {\n for (const [key, value] of result.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n result.set(key, deserializeResult(value))\n }\n\n return result as unknown as T\n }\n\n if (result && typeof result === 'object') {\n for (const [key, value] of Object.entries(result)) {\n if (value && typeof value === 'object' && (value as Record<string, string>).__type === 'long') {\n // eslint-disable-next-line\n ;(result as any)[key] = Long.fromValue(value as unknown as Long)\n } else if (typeof value === 'object') {\n // eslint-disable-next-line\n ;(result as any)[key] = deserializeResult(value as SerializedResult<unknown>)\n }\n }\n }\n\n return result as unknown as T\n}\n"]}
@@ -255,7 +255,7 @@ export class NetworkManager {
255
255
  _: 'initConnection',
256
256
  deviceModel,
257
257
  systemVersion: '1.0',
258
- appVersion: '0.16.3',
258
+ appVersion: '0.16.6',
259
259
  systemLangCode: 'en',
260
260
  langPack: '', // "langPacks are for official apps only"
261
261
  langCode: 'en',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mtcute/core",
3
- "version": "0.16.3",
3
+ "version": "0.16.6",
4
4
  "description": "Type-safe library for MTProto (Telegram API)",
5
5
  "author": "alina sireneva <alina@tei.su>",
6
6
  "license": "MIT",
@@ -34,7 +34,7 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "@mtcute/tl": "^185.0.0",
37
+ "@mtcute/tl": "^185.1.0",
38
38
  "@mtcute/tl-runtime": "^0.16.0",
39
39
  "@mtcute/file-id": "^0.16.0",
40
40
  "@types/events": "3.0.0",