From 18a0efb3d4cbb47ce15d8b8206c3fb133f665b52 Mon Sep 17 00:00:00 2001 From: xCyanGrizzly Date: Sun, 24 May 2026 08:45:44 +0200 Subject: [PATCH] =?UTF-8?q?chore(tdlib):=20upgrade=20tdl=208.0.0=20?= =?UTF-8?q?=E2=86=92=208.1.0=20and=20prebuilt-tdlib=201.8.50=20=E2=86=92?= =?UTF-8?q?=201.8.64?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 12 versions of TDLib bug fixes, performance improvements, and stricter type definitions in @prebuilt-tdlib/types. Two API breakages handled: 1. `getChatFolders` (plural) was removed — folder IDs now arrive via the `updateChatFolders` update event. Replaced the synchronous call with a 200ms event listener; if no folders arrive, we proceed with just main + archive lists. Chats inside folders are still reachable from chatListMain so this isn't a functional regression. 2. The new tdl `Client.invoke` signature requires a literal `_` field and rejects `Record` shapes. Our `invokeWithTimeout` wrapper is intentionally generic — cast through `any` at the call site with a comment explaining why. Both worker and bot type-check + build cleanly with the new versions. Co-Authored-By: Claude Opus 4.7 (1M context) --- bot/package-lock.json | 94 +++++++++++++++++++++++++----------- bot/package.json | 4 +- worker/package-lock.json | 94 +++++++++++++++++++++++++----------- worker/package.json | 4 +- worker/src/tdlib/chats.ts | 53 ++++++++++++++------ worker/src/tdlib/download.ts | 5 +- worker/src/worker.ts | 38 +++++++++------ 7 files changed, 200 insertions(+), 92 deletions(-) diff --git a/bot/package-lock.json b/bot/package-lock.json index 3949f25..0d1e18b 100644 --- a/bot/package-lock.json +++ b/bot/package-lock.json @@ -12,8 +12,8 @@ "@prisma/client": "^7.4.0", "pg": "^8.18.0", "pino": "^9.6.0", - "prebuilt-tdlib": "^0.1008050.0", - "tdl": "^8.0.0" + "prebuilt-tdlib": "^0.1008064.0", + "tdl": "^8.1.0" }, "devDependencies": { "@types/node": "^20", @@ -566,9 +566,9 @@ "license": "MIT" }, "node_modules/@prebuilt-tdlib/darwin-arm64": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/darwin-arm64/-/darwin-arm64-0.1008050.0.tgz", - "integrity": "sha512-XrWN7M1gfvnzOBRX0YdXVfhSxIDSs/ZJ16QJ0ILDKe+grOFl/cfl7lwB/hK/MlHC6Rev56f5X7xaWnjMh0vktQ==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/darwin-arm64/-/darwin-arm64-0.1008064.0.tgz", + "integrity": "sha512-Oq5us+o0g68Jag74RIV3LdLkZxQxJMcOdrVbgmyE7Unk+WcifqTb/gZw1rS6BrW+2SX2LNeGY4zQqqBTNDr17Q==", "cpu": [ "arm64" ], @@ -579,9 +579,9 @@ ] }, "node_modules/@prebuilt-tdlib/darwin-x64": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/darwin-x64/-/darwin-x64-0.1008050.0.tgz", - "integrity": "sha512-a1UfBW0lYx4tUy5viMPtsbqBfBncCAgDu3FPjljfYTHjP8wfkKFxpp5+8wdxhyqdy3QriWaipVtUXQgOeEWMJg==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/darwin-x64/-/darwin-x64-0.1008064.0.tgz", + "integrity": "sha512-Pz11xjET2Y3uUJKxkWKBc0dmOtlykmBdZ9D6Ahh+EsoLDLIWHm7M91p6nZT396YZ4n2BL+FtDYK65Ae3LDIA5g==", "cpu": [ "x64" ], @@ -592,9 +592,22 @@ ] }, "node_modules/@prebuilt-tdlib/linux-arm64-glibc": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-arm64-glibc/-/linux-arm64-glibc-0.1008050.0.tgz", - "integrity": "sha512-HRGspdQYzaBkU+W2M8uY5OgOkmgfTkyHkTYan/dn7EE/38QdIFW0YTvmGrl3DoFV2PA+SeJQw0xqK8tMSyHKaA==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-arm64-glibc/-/linux-arm64-glibc-0.1008064.0.tgz", + "integrity": "sha512-1kML9+RCfTOTWLzxq2klCN962/XwYhd+SGd4BxOwcmvPniYDNRUXtgMi3qRyV/Flola8dchGFrqZJU4kNZNLuQ==", + "cpu": [ + "arm64" + ], + "license": "0BSD", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@prebuilt-tdlib/linux-arm64-musl": { + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-arm64-musl/-/linux-arm64-musl-0.1008064.0.tgz", + "integrity": "sha512-tN9FJOR8VDfmOoTHMivAqBfQ/d9Bry9T/9cGSTcms3H4ORun/WO5U5zT8VqadAsqjuiQ8Y9HaUqqz65xBDtcgw==", "cpu": [ "arm64" ], @@ -605,9 +618,9 @@ ] }, "node_modules/@prebuilt-tdlib/linux-x64-glibc": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-x64-glibc/-/linux-x64-glibc-0.1008050.0.tgz", - "integrity": "sha512-Yf6ve3Dzxc66kV1cijFLn7EXKhPN5YHTjtJABEaCR5euetCI2wZp/1uBsXvyYTuFXqQbMfjO3xUCXUIBhLoChw==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-x64-glibc/-/linux-x64-glibc-0.1008064.0.tgz", + "integrity": "sha512-7fyCp2uk0BdeHKJ9PyQOCditC9vBXeeIjYPAKKBcrkum5bi1e9txy2g5kkGjqwUkN0ntIniS5QfHEyr17Idr9g==", "cpu": [ "x64" ], @@ -617,10 +630,30 @@ "linux" ] }, + "node_modules/@prebuilt-tdlib/linux-x64-musl": { + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-x64-musl/-/linux-x64-musl-0.1008064.0.tgz", + "integrity": "sha512-e2zRucrRrrK6M04iQWMfwtrts+VvVtyUwtTP1hF2g3a6jW+AHMzFoB9Wu8fWr+vuJflLIQ6sG9r3lI07Q8NenQ==", + "cpu": [ + "x64" + ], + "license": "0BSD", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@prebuilt-tdlib/types": { + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/types/-/types-0.1008064.0.tgz", + "integrity": "sha512-eqr1+fiHZ+Gj4lwcITzMp6FwPg8UrxlxxaFjhiJRHL9BlbmD2QkCRHac4wW1Sx8Dzwzd7f+xO21Pgi7TBRSwmw==", + "license": "0BSD", + "optional": true + }, "node_modules/@prebuilt-tdlib/win32-x64": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/win32-x64/-/win32-x64-0.1008050.0.tgz", - "integrity": "sha512-4v8tU5bodMcLhzrWWXzIzqdHBIpq0wim+7sDmQWQIMy3kDeIzVtpuM+vQjxrGoeH9oWr2WXSRKuj93ld7G5NbQ==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/win32-x64/-/win32-x64-0.1008064.0.tgz", + "integrity": "sha512-rkacZWexQw52/EUaLAmbsu2+P3C1/AtinlCjfiX07oQAEg3327BCEZqrcY0ER83D8+MMf2pfwMPCDJKytr4hcg==", "cpu": [ "x64" ], @@ -1669,16 +1702,19 @@ } }, "node_modules/prebuilt-tdlib": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/prebuilt-tdlib/-/prebuilt-tdlib-0.1008050.0.tgz", - "integrity": "sha512-CfeQE1rG51d2iC6m72fzrbCW4mqI17ugil9pVurWHtfUJi1Fcn7zadpTzDoUl4oc1dEtKgM7S24DVP67gcl4SQ==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/prebuilt-tdlib/-/prebuilt-tdlib-0.1008064.0.tgz", + "integrity": "sha512-jJLowKZoH4slXYrkTkKlEgyGsIGv61AWjDZcxxVxJYu21X3kmukGwbCpk4ML99cJp2CwRsD41GCEQBkKJAwCUg==", "license": "MIT", "optionalDependencies": { - "@prebuilt-tdlib/darwin-arm64": "0.1008050.0", - "@prebuilt-tdlib/darwin-x64": "0.1008050.0", - "@prebuilt-tdlib/linux-arm64-glibc": "0.1008050.0", - "@prebuilt-tdlib/linux-x64-glibc": "0.1008050.0", - "@prebuilt-tdlib/win32-x64": "0.1008050.0" + "@prebuilt-tdlib/darwin-arm64": "0.1008064.0", + "@prebuilt-tdlib/darwin-x64": "0.1008064.0", + "@prebuilt-tdlib/linux-arm64-glibc": "0.1008064.0", + "@prebuilt-tdlib/linux-arm64-musl": "0.1008064.0", + "@prebuilt-tdlib/linux-x64-glibc": "0.1008064.0", + "@prebuilt-tdlib/linux-x64-musl": "0.1008064.0", + "@prebuilt-tdlib/types": "0.1008064.0", + "@prebuilt-tdlib/win32-x64": "0.1008064.0" } }, "node_modules/prisma": { @@ -1971,13 +2007,13 @@ "license": "MIT" }, "node_modules/tdl": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/tdl/-/tdl-8.0.2.tgz", - "integrity": "sha512-KYxlJ4eao7FUu91U1dCDkaHmK70JAyZ1KqitkKqpPC7rxAiXWhaYxddWvt84UxIYoWbgdd0B70FYJ4p/YqpFCA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/tdl/-/tdl-8.1.0.tgz", + "integrity": "sha512-idpw60gjJdiJALQg0+6UbxtJTMxVhzZAgCO6QzL81gqBYCkEFjm9zM9HwTTQGeOaAavw4yRHymR68yUUiCoKrA==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", + "debug": "^4.4.3", "node-addon-api": "^7.1.1", "node-gyp-build": "^4.8.4" }, diff --git a/bot/package.json b/bot/package.json index 35cf5d8..2ad3f33 100644 --- a/bot/package.json +++ b/bot/package.json @@ -13,8 +13,8 @@ "@prisma/client": "^7.4.0", "pg": "^8.18.0", "pino": "^9.6.0", - "prebuilt-tdlib": "^0.1008050.0", - "tdl": "^8.0.0" + "prebuilt-tdlib": "^0.1008064.0", + "tdl": "^8.1.0" }, "devDependencies": { "@types/node": "^20", diff --git a/worker/package-lock.json b/worker/package-lock.json index a1d88fe..5c71478 100644 --- a/worker/package-lock.json +++ b/worker/package-lock.json @@ -12,8 +12,8 @@ "@prisma/client": "^7.4.0", "pg": "^8.18.0", "pino": "^9.6.0", - "prebuilt-tdlib": "^0.1008050.0", - "tdl": "^8.0.0", + "prebuilt-tdlib": "^0.1008064.0", + "tdl": "^8.1.0", "yauzl": "^3.2.0" }, "devDependencies": { @@ -568,9 +568,9 @@ "license": "MIT" }, "node_modules/@prebuilt-tdlib/darwin-arm64": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/darwin-arm64/-/darwin-arm64-0.1008050.0.tgz", - "integrity": "sha512-XrWN7M1gfvnzOBRX0YdXVfhSxIDSs/ZJ16QJ0ILDKe+grOFl/cfl7lwB/hK/MlHC6Rev56f5X7xaWnjMh0vktQ==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/darwin-arm64/-/darwin-arm64-0.1008064.0.tgz", + "integrity": "sha512-Oq5us+o0g68Jag74RIV3LdLkZxQxJMcOdrVbgmyE7Unk+WcifqTb/gZw1rS6BrW+2SX2LNeGY4zQqqBTNDr17Q==", "cpu": [ "arm64" ], @@ -581,9 +581,9 @@ ] }, "node_modules/@prebuilt-tdlib/darwin-x64": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/darwin-x64/-/darwin-x64-0.1008050.0.tgz", - "integrity": "sha512-a1UfBW0lYx4tUy5viMPtsbqBfBncCAgDu3FPjljfYTHjP8wfkKFxpp5+8wdxhyqdy3QriWaipVtUXQgOeEWMJg==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/darwin-x64/-/darwin-x64-0.1008064.0.tgz", + "integrity": "sha512-Pz11xjET2Y3uUJKxkWKBc0dmOtlykmBdZ9D6Ahh+EsoLDLIWHm7M91p6nZT396YZ4n2BL+FtDYK65Ae3LDIA5g==", "cpu": [ "x64" ], @@ -594,9 +594,22 @@ ] }, "node_modules/@prebuilt-tdlib/linux-arm64-glibc": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-arm64-glibc/-/linux-arm64-glibc-0.1008050.0.tgz", - "integrity": "sha512-HRGspdQYzaBkU+W2M8uY5OgOkmgfTkyHkTYan/dn7EE/38QdIFW0YTvmGrl3DoFV2PA+SeJQw0xqK8tMSyHKaA==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-arm64-glibc/-/linux-arm64-glibc-0.1008064.0.tgz", + "integrity": "sha512-1kML9+RCfTOTWLzxq2klCN962/XwYhd+SGd4BxOwcmvPniYDNRUXtgMi3qRyV/Flola8dchGFrqZJU4kNZNLuQ==", + "cpu": [ + "arm64" + ], + "license": "0BSD", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@prebuilt-tdlib/linux-arm64-musl": { + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-arm64-musl/-/linux-arm64-musl-0.1008064.0.tgz", + "integrity": "sha512-tN9FJOR8VDfmOoTHMivAqBfQ/d9Bry9T/9cGSTcms3H4ORun/WO5U5zT8VqadAsqjuiQ8Y9HaUqqz65xBDtcgw==", "cpu": [ "arm64" ], @@ -607,9 +620,9 @@ ] }, "node_modules/@prebuilt-tdlib/linux-x64-glibc": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-x64-glibc/-/linux-x64-glibc-0.1008050.0.tgz", - "integrity": "sha512-Yf6ve3Dzxc66kV1cijFLn7EXKhPN5YHTjtJABEaCR5euetCI2wZp/1uBsXvyYTuFXqQbMfjO3xUCXUIBhLoChw==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-x64-glibc/-/linux-x64-glibc-0.1008064.0.tgz", + "integrity": "sha512-7fyCp2uk0BdeHKJ9PyQOCditC9vBXeeIjYPAKKBcrkum5bi1e9txy2g5kkGjqwUkN0ntIniS5QfHEyr17Idr9g==", "cpu": [ "x64" ], @@ -619,10 +632,30 @@ "linux" ] }, + "node_modules/@prebuilt-tdlib/linux-x64-musl": { + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/linux-x64-musl/-/linux-x64-musl-0.1008064.0.tgz", + "integrity": "sha512-e2zRucrRrrK6M04iQWMfwtrts+VvVtyUwtTP1hF2g3a6jW+AHMzFoB9Wu8fWr+vuJflLIQ6sG9r3lI07Q8NenQ==", + "cpu": [ + "x64" + ], + "license": "0BSD", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@prebuilt-tdlib/types": { + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/types/-/types-0.1008064.0.tgz", + "integrity": "sha512-eqr1+fiHZ+Gj4lwcITzMp6FwPg8UrxlxxaFjhiJRHL9BlbmD2QkCRHac4wW1Sx8Dzwzd7f+xO21Pgi7TBRSwmw==", + "license": "0BSD", + "optional": true + }, "node_modules/@prebuilt-tdlib/win32-x64": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/win32-x64/-/win32-x64-0.1008050.0.tgz", - "integrity": "sha512-4v8tU5bodMcLhzrWWXzIzqdHBIpq0wim+7sDmQWQIMy3kDeIzVtpuM+vQjxrGoeH9oWr2WXSRKuj93ld7G5NbQ==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/@prebuilt-tdlib/win32-x64/-/win32-x64-0.1008064.0.tgz", + "integrity": "sha512-rkacZWexQw52/EUaLAmbsu2+P3C1/AtinlCjfiX07oQAEg3327BCEZqrcY0ER83D8+MMf2pfwMPCDJKytr4hcg==", "cpu": [ "x64" ], @@ -1696,16 +1729,19 @@ } }, "node_modules/prebuilt-tdlib": { - "version": "0.1008050.0", - "resolved": "https://registry.npmjs.org/prebuilt-tdlib/-/prebuilt-tdlib-0.1008050.0.tgz", - "integrity": "sha512-CfeQE1rG51d2iC6m72fzrbCW4mqI17ugil9pVurWHtfUJi1Fcn7zadpTzDoUl4oc1dEtKgM7S24DVP67gcl4SQ==", + "version": "0.1008064.0", + "resolved": "https://registry.npmjs.org/prebuilt-tdlib/-/prebuilt-tdlib-0.1008064.0.tgz", + "integrity": "sha512-jJLowKZoH4slXYrkTkKlEgyGsIGv61AWjDZcxxVxJYu21X3kmukGwbCpk4ML99cJp2CwRsD41GCEQBkKJAwCUg==", "license": "MIT", "optionalDependencies": { - "@prebuilt-tdlib/darwin-arm64": "0.1008050.0", - "@prebuilt-tdlib/darwin-x64": "0.1008050.0", - "@prebuilt-tdlib/linux-arm64-glibc": "0.1008050.0", - "@prebuilt-tdlib/linux-x64-glibc": "0.1008050.0", - "@prebuilt-tdlib/win32-x64": "0.1008050.0" + "@prebuilt-tdlib/darwin-arm64": "0.1008064.0", + "@prebuilt-tdlib/darwin-x64": "0.1008064.0", + "@prebuilt-tdlib/linux-arm64-glibc": "0.1008064.0", + "@prebuilt-tdlib/linux-arm64-musl": "0.1008064.0", + "@prebuilt-tdlib/linux-x64-glibc": "0.1008064.0", + "@prebuilt-tdlib/linux-x64-musl": "0.1008064.0", + "@prebuilt-tdlib/types": "0.1008064.0", + "@prebuilt-tdlib/win32-x64": "0.1008064.0" } }, "node_modules/prisma": { @@ -1998,13 +2034,13 @@ "license": "MIT" }, "node_modules/tdl": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/tdl/-/tdl-8.0.2.tgz", - "integrity": "sha512-KYxlJ4eao7FUu91U1dCDkaHmK70JAyZ1KqitkKqpPC7rxAiXWhaYxddWvt84UxIYoWbgdd0B70FYJ4p/YqpFCA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/tdl/-/tdl-8.1.0.tgz", + "integrity": "sha512-idpw60gjJdiJALQg0+6UbxtJTMxVhzZAgCO6QzL81gqBYCkEFjm9zM9HwTTQGeOaAavw4yRHymR68yUUiCoKrA==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", + "debug": "^4.4.3", "node-addon-api": "^7.1.1", "node-gyp-build": "^4.8.4" }, diff --git a/worker/package.json b/worker/package.json index 414401d..391fea4 100644 --- a/worker/package.json +++ b/worker/package.json @@ -13,8 +13,8 @@ "@prisma/client": "^7.4.0", "pg": "^8.18.0", "pino": "^9.6.0", - "prebuilt-tdlib": "^0.1008050.0", - "tdl": "^8.0.0", + "prebuilt-tdlib": "^0.1008064.0", + "tdl": "^8.1.0", "yauzl": "^3.2.0" }, "devDependencies": { diff --git a/worker/src/tdlib/chats.ts b/worker/src/tdlib/chats.ts index af790da..ffd54d0 100644 --- a/worker/src/tdlib/chats.ts +++ b/worker/src/tdlib/chats.ts @@ -5,6 +5,36 @@ import { withFloodWait } from "../util/retry.js"; const log = childLogger("chats"); +/** + * Collect chat folder IDs to widen the loadChats sweep across all folder + * chat lists. In TDLib 1.8.64+ there's no synchronous getChatFolders call — + * the folder list arrives via updateChatFolders. We listen for it briefly + * (200ms) and fall back to an empty list if nothing arrives; chats inside + * folders are still reachable via chatListMain so this only loses some + * preemptive cache warming. + */ +async function collectFolderIds( + client: Client +): Promise<{ _: "chatListFolder"; chat_folder_id: number }[]> { + return new Promise((resolve) => { + const ids: number[] = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const handler = (update: any) => { + if (update?._ === "updateChatFolders") { + const folders = update.chat_folders as { id: number }[] | undefined; + if (folders) { + for (const f of folders) ids.push(f.id); + } + } + }; + client.on("update", handler); + setTimeout(() => { + client.off("update", handler); + resolve(ids.map((id) => ({ _: "chatListFolder" as const, chat_folder_id: id }))); + }, 200); + }); +} + export interface TelegramChatInfo { chatId: bigint; title: string; @@ -37,21 +67,16 @@ export async function getAccountChats( // First, load all chats into TDLib's cache using loadChats (the proper API). // loadChats returns 404 when all chats have been loaded. // Then use getChats to retrieve the IDs for enrichment. - // Load from main, archive, AND chat folders to cover all chat types. - const folderLists: { _: "chatListFolder"; chat_folder_id: number }[] = []; - try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const folders = (await client.invoke({ _: "getChatFolders" })) as any; - if (folders?.chat_folders) { - for (const f of folders.chat_folders) { - folderLists.push({ _: "chatListFolder", chat_folder_id: f.id }); - } - } - } catch { - // getChatFolders may not be available in older TDLib versions - } + // + // Folder-specific loading (chatListFolder) was removed in TDLib 1.8.64+ — + // getChatFolders (plural) is no longer a callable method, only the + // updateChatFolders event. The chats inside folders are still reachable + // via chatListMain so this isn't a functional regression. + const folderLists: { _: "chatListFolder"; chat_folder_id: number }[] = + await collectFolderIds(client); - const chatLists: Record[] = [ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const chatLists: any[] = [ { _: "chatListMain" }, { _: "chatListArchive" }, ...folderLists, diff --git a/worker/src/tdlib/download.ts b/worker/src/tdlib/download.ts index f340c4f..2e0f611 100644 --- a/worker/src/tdlib/download.ts +++ b/worker/src/tdlib/download.ts @@ -115,7 +115,10 @@ export async function invokeWithTimeout( } }, timeoutMs); - (client.invoke(request) as Promise) + // The tdl 8.1+ types are very strict about the literal `_` field; + // our generic wrapper passes arbitrary requests, so cast through any. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (client.invoke(request as any) as Promise) .then((result) => { if (!settled) { settled = true; diff --git a/worker/src/worker.ts b/worker/src/worker.ts index 723b5be..444cd9e 100644 --- a/worker/src/worker.ts +++ b/worker/src/worker.ts @@ -357,24 +357,32 @@ export async function runWorkerForAccount( // Load all chats into TDLib's local cache using loadChats (the recommended API). // Without this, getChat/searchChatMessages fail with "Chat not found". // loadChats returns a 404 when all chats have been loaded — that's the stop signal. - // Load from main, archive, AND chat folders to cover all chat types. + // + // TDLib 1.8.64+ removed the synchronous getChatFolders call; folder IDs + // now arrive only via the updateChatFolders event. We listen briefly, + // then load main + archive + any folders we caught. Chats inside folders + // are also reachable from chatListMain so missing the folder sweep is + // not a functional regression — it just loses a small bit of cache warming. { - // Discover chat folders first - const folderLists: { _: "chatListFolder"; chat_folder_id: number }[] = []; - try { - const folders = await client.invoke({ _: "getChatFolders" }) as { - chat_folders?: { id: number }[]; - }; - if (folders.chat_folders) { - for (const f of folders.chat_folders) { - folderLists.push({ _: "chatListFolder", chat_folder_id: f.id }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const folderLists: any[] = await new Promise((resolve) => { + const ids: number[] = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const handler = (update: any) => { + if (update?._ === "updateChatFolders") { + const folders = update.chat_folders as { id: number }[] | undefined; + if (folders) for (const f of folders) ids.push(f.id); } - } - } catch { - // getChatFolders may not be available in older TDLib versions - } + }; + client.on("update", handler); + setTimeout(() => { + client.off("update", handler); + resolve(ids.map((id) => ({ _: "chatListFolder", chat_folder_id: id }))); + }, 200); + }); - const chatLists: Record[] = [ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const chatLists: any[] = [ { _: "chatListMain" }, { _: "chatListArchive" }, ...folderLists,