mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-05-15 01:35:38 +00:00
fefdea8ed0
* 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
52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
import {Mutex} from "async-mutex"
|
|
import {api, core} from "simplex-chat"
|
|
import {T} from "@simplex-chat/types"
|
|
|
|
export const profileMutex = new Mutex()
|
|
|
|
export function isChatNotFound(err: unknown, kind: "group" | "contact"): boolean {
|
|
if (!(err instanceof core.ChatAPIError)) return false
|
|
if (err.chatError?.type !== "errorStore") return false
|
|
const seType = err.chatError.storeError.type
|
|
return kind === "group" ? seType === "groupNotFound" : seType === "contactNotFound"
|
|
}
|
|
|
|
export async function getGroupInfo(chat: api.ChatApi, groupId: number): Promise<T.GroupInfo | null> {
|
|
try {
|
|
const c = await chat.apiGetChat(T.ChatType.Group, groupId, 0)
|
|
return c.chatInfo.type === "group" ? c.chatInfo.groupInfo : null
|
|
} catch (err) {
|
|
if (isChatNotFound(err, "group")) return null
|
|
throw err
|
|
}
|
|
}
|
|
|
|
export async function getContact(chat: api.ChatApi, contactId: number): Promise<T.Contact | null> {
|
|
try {
|
|
const c = await chat.apiGetChat(T.ChatType.Direct, contactId, 0)
|
|
return c.chatInfo.type === "direct" ? c.chatInfo.contact : null
|
|
} catch (err) {
|
|
if (isChatNotFound(err, "contact")) return null
|
|
throw err
|
|
}
|
|
}
|
|
|
|
export function isWeekend(timezone: string): boolean {
|
|
const day = new Intl.DateTimeFormat("en-US", {timeZone: timezone, weekday: "short"}).format(new Date())
|
|
return day === "Sat" || day === "Sun"
|
|
}
|
|
|
|
export function log(msg: string, ...args: unknown[]): void {
|
|
const ts = new Date().toISOString()
|
|
if (args.length > 0) {
|
|
console.log(`[${ts}] ${msg}`, ...args)
|
|
} else {
|
|
console.log(`[${ts}] ${msg}`)
|
|
}
|
|
}
|
|
|
|
export function logError(msg: string, err: unknown): void {
|
|
const ts = new Date().toISOString()
|
|
console.error(`[${ts}] ERROR: ${msg}`, err)
|
|
}
|