(tgsBuffer: Buffer)
| 95 | big: isBig, |
| 96 | }); |
| 97 | const dcId = photo.dcId ?? fullEntity?.photo?.dc_id; |
| 98 | const result = await withTimeout( |
| 99 | client.invoke( |
| 100 | new Api.upload.GetFile({ |
| 101 | location, |
| 102 | offset: bigInteger.zero, |
| 103 | limit: 512 * 1024, |
| 104 | precise: true, |
| 105 | }), |
| 106 | dcId, |
| 107 | ), |
| 108 | QUOTE_RPC_TIMEOUT_MS, |
| 109 | `downloadEntityAvatar.${isBig ? "big" : "small"}`, |
| 110 | ) as { bytes?: unknown }; |
| 111 | const buffer = result?.bytes; |
| 112 | return Buffer.isBuffer(buffer) && buffer.length > 0 ? buffer : undefined; |
| 113 | } catch (err: any) { |
| 114 | console.warn(`yvlu avatar ${isBig ? "big" : "small"} download failed`, err?.message || err); |
| 115 | return undefined; |
| 116 | } |
| 117 | }; |
| 118 | |
| 119 | const [small, big] = await Promise.all([tryDownload(false), tryDownload(true)]); |
| 120 | const normalized = small ? await normalizeAvatarBuffer(small) : big ? await normalizeAvatarBuffer(big) : undefined; |
| 121 | if (key) avatarCache.set(key, normalized); |
| 122 | return normalized; |
| 123 | } |
| 124 | |
| 125 | async function normalizeAvatarBuffer(buffer: Buffer): Promise<Buffer> { |
| 126 | try { |
| 127 | const sharp = (await import("sharp")).default; |
| 128 | return await sharp(buffer) |
| 129 | .resize(256, 256, { fit: "cover", position: "centre" }) |
| 130 | .flatten({ background: { r: 0, g: 0, b: 0 } }) |
| 131 | .png() |
| 132 | .toBuffer(); |
| 133 | } catch (err: any) { |
| 134 | console.warn("yvlu avatar normalize failed", err?.message || err); |
| 135 | return buffer.length > 0 ? buffer : undefined; |
| 136 | } |
| 137 | } |
| 138 | |
| 139 | async function rawDownloadFile(client: any, location: any, dcId: number | undefined): Promise<Buffer | undefined> { |
| 140 | if (!client || !location) return undefined; |
| 141 | try { |
| 142 | const result = await withTimeout( |
| 143 | client.invoke( |
| 144 | new Api.upload.GetFile({ |
| 145 | location, |
| 146 | offset: bigInteger.zero, |
| 147 | limit: 512 * 1024, |
| 148 | precise: true, |
| 149 | }), |
| 150 | dcId, |
| 151 | ), |
no test coverage detected