support bot, bots: paginate chat scan (#6935)

* bots: document APIGetChats command and CRApiChats response

* bots: regenerate API docs and TypeScript types

* simplex-chat-nodejs: add apiGetChats

* support bot: avoid OOM on large databases

apiListGroups / apiListContacts return every record in one response and
overflow V8's string allocation on large DBs. Replace list-then-find-by-id
patterns with apiGetChat(type, id, 0) lookups, and the one genuine scan
(refreshAllCards) with paginated apiGetChats, count=1000.

* support bot: update test assertions to match current message text

* bots: simplify PaginationByTime, expose only PTLast

* simplex-chat-nodejs: bump types and nodejs versions
This commit is contained in:
sh
2026-05-06 07:54:36 +00:00
committed by GitHub
parent db783d85d7
commit fefdea8ed0
22 changed files with 673 additions and 62 deletions
+19
View File
@@ -764,6 +764,25 @@ export class ChatApi {
throw new ChatCommandError("error listing groups", r)
}
/**
* Get chat previews (paginated).
* Network usage: no.
*
* Prefer this over apiListContacts / apiListGroups for any scan: those
* methods load every record into memory in a single response and will fail
* on large databases.
*/
async apiGetChats(
userId: number,
pagination: T.PaginationByTime,
query: T.ChatListQuery = {type: "filters", favorite: false, unread: false},
pendingConnections = false,
): Promise<T.AChat[]> {
const r = await this.sendChatCmd(CC.APIGetChats.cmdString({userId, pendingConnections, pagination, query}))
if (r.type === "apiChats") return r.chats
throw new ChatCommandError("error getting chats", r)
}
/**
* Delete chat.
* Network usage: background.
@@ -4,7 +4,7 @@ const path = require('path');
const extract = require('extract-zip');
const GITHUB_REPO = 'simplex-chat/simplex-chat-libs';
const RELEASE_TAG = 'v6.5.0';
const RELEASE_TAG = 'v6.5.1';
const BACKEND = (process.env.SIMPLEX_BACKEND || process.env.npm_config_simplex_backend || 'sqlite').toLowerCase();
if (BACKEND !== 'sqlite' && BACKEND !== 'postgres') {