From 81408e3b0dc20491363b830f75516db57d0a02ff Mon Sep 17 00:00:00 2001 From: powerdot Date: Mon, 13 Jul 2026 16:37:27 +0400 Subject: [PATCH 1/3] fix: callback_query --- MIGRATION.md | 2 ++ lib/bot_middlewares/router.js | 9 +++++++++ lib/bot_middlewares/router.js.map | 2 +- src/bot_middlewares/router.ts | 7 +++++++ test/router.test.ts | 23 ++++++++++++++++++++++- 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index d210146..8ec18e4 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -56,6 +56,8 @@ The example scripts now use `tsx` and Node.js built-in watch mode instead of `ts Components can subscribe to arbitrary Telegram update types through `events`. Existing `message` and `callback_query` routing remains compatible. +TBF now automatically acknowledges callback queries before running their actions. This clears Telegram's inline-button loading indicator before a page edits the message or replaces its keyboard. Expired callback acknowledgements are ignored and do not prevent routing. + Action handlers now expose `reply`, media helpers, `sendPoll`, `sendLocation`, `sendChatAction`, `react`, and the generic `api(method, payload)` escape hatch. The generic API method is intentionally loosely typed so applications can use a newly released Telegram method before Telegraf and TBF publish updated types. ## Page navigation and runtime lifecycle diff --git a/lib/bot_middlewares/router.js b/lib/bot_middlewares/router.js index f0d5eb9..52d53a4 100644 --- a/lib/bot_middlewares/router.js +++ b/lib/bot_middlewares/router.js @@ -10,6 +10,15 @@ exports.default = ({ db, components, config }) => { let ctx = _ctx; if (config.debug) console.log('==============v'); + if (ctx.updateType === "callback_query") { + try { + await ctx.answerCbQuery(); + } + catch (error) { + if (config.debug) + console.warn("[router] Unable to answer callback query:", error); + } + } const isRoutableUpdate = ctx.updateType === "message" || ctx.updateType === "callback_query"; let step_ = isRoutableUpdate ? await db.getValue(ctx, 'step') : undefined; let parseCallbackPath = (0, helpers_1.parseCallbackPath)(ctx); diff --git a/lib/bot_middlewares/router.js.map b/lib/bot_middlewares/router.js.map index 221b52e..58c8bbc 100644 --- a/lib/bot_middlewares/router.js.map +++ b/lib/bot_middlewares/router.js.map @@ -1 +1 @@ -{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/bot_middlewares/router.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/bot_middlewares/router.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/bot_middlewares/router.ts b/src/bot_middlewares/router.ts index 12612ad..dbbbac5 100644 --- a/src/bot_middlewares/router.ts +++ b/src/bot_middlewares/router.ts @@ -7,6 +7,13 @@ export default ({ db, components, config }: { db: DB, components: Component[], c return async function (_ctx: TBFContext, next: Function) { let ctx = _ctx; if (config.debug) console.log('==============v') + if (ctx.updateType === "callback_query") { + try { + await ctx.answerCbQuery(); + } catch (error) { + if (config.debug) console.warn("[router] Unable to answer callback query:", error); + } + } const isRoutableUpdate = ctx.updateType === "message" || ctx.updateType === "callback_query"; let step_ = isRoutableUpdate ? await db.getValue(ctx, 'step') : undefined; let parseCallbackPath: CallbackPath = ParseCallbackPath(ctx); diff --git a/test/router.test.ts b/test/router.test.ts index c4399b9..7f77013 100644 --- a/test/router.test.ts +++ b/test/router.test.ts @@ -21,6 +21,7 @@ test("router dispatches callback data and waits for the component", async () => updateType: "callback_query", update: { callback_query: { data: "catalog�open�N42" } }, callbackQuery: { data: "catalog�open�N42" }, + async answerCbQuery() { order.push("answer"); }, } as never; await createRouter({ db, components: [component], config: {} })(ctx, async () => { @@ -36,7 +37,27 @@ test("router dispatches callback data and waits for the component", async () => message: undefined, isMessageFromUser: false, }); - assert.deepEqual(order, ["component", "next"]); + assert.deepEqual(order, ["answer", "component", "next"]); +}); + +test("router continues when an expired callback query cannot be answered", async () => { + let routed = false; + const db = { async getValue() { return undefined; } } as never; + const component = { + id: "catalog", + actions: { main() {} }, + async call() { routed = true; }, + } as never; + const ctx = { + updateType: "callback_query", + update: { callback_query: { data: "catalog�main" } }, + callbackQuery: { data: "catalog�main" }, + async answerCbQuery() { throw new Error("query is too old"); }, + } as never; + + await createRouter({ db, components: [component], config: {} })(ctx, async () => undefined); + + assert.equal(routed, true); }); test("router falls back to the saved step for messages", async () => { From 18e5bdeb50196abfb1259c83d3228af7a1958246 Mon Sep 17 00:00:00 2001 From: powerdot Date: Mon, 13 Jul 2026 16:45:23 +0400 Subject: [PATCH 2/3] added chatActionManager --- MIGRATION.md | 4 ++ README.md | 38 +++++++++++ lib/config.d.ts | 3 + lib/config.js | 3 + lib/config.js.map | 2 +- lib/index.js | 4 +- lib/index.js.map | 2 +- lib/page_loader.d.ts | 3 +- lib/page_loader.js | 82 +++++++++++++++++++++--- lib/page_loader.js.map | 2 +- lib/types/index.d.ts | 23 ++++++- src/config.ts | 6 ++ src/index.ts | 3 +- src/page_loader.ts | 132 ++++++++++++++++++++++++++++++--------- src/types/index.d.ts | 23 ++++++- test/config.test.ts | 3 + test/page_loader.test.ts | 44 ++++++++++++- 17 files changed, 328 insertions(+), 49 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index 8ec18e4..efd62ab 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -60,6 +60,10 @@ TBF now automatically acknowledges callback queries before running their actions Action handlers now expose `reply`, media helpers, `sendPoll`, `sendLocation`, `sendChatAction`, `react`, and the generic `api(method, payload)` escape hatch. The generic API method is intentionally loosely typed so applications can use a newly released Telegram method before Telegraf and TBF publish updated types. +Long-running operations can use `withChatAction("typing", callback)` to keep Telegram's activity status alive until the callback settles. An action or message handler can instead declare `chatAction: "typing"`; no status is sent unless one of these opt-in forms is used. + +Set `chatActions.stopOnNavigation: true` to stop refreshing active chat actions before `goToAction`, `goToPage`, `goToPlugin`, or `openPage` starts the next action. It defaults to `false` for compatibility. + ## Page navigation and runtime lifecycle `await openPage()` now waits for the selected page action to finish. This fixes the previous promise contract, which resolved immediately after starting the action. diff --git a/README.md b/README.md index 3b0953d..d8725ae 100644 --- a/README.md +++ b/README.md @@ -378,6 +378,7 @@ Messaging * `this.sendPhoto()`, `sendVideo()`, `sendAnimation()`, `sendAudio()`, `sendDocument()`, `sendVoice()`, `sendSticker()` send media and register resulting messages for cleanup. * `this.sendLocation()` and `this.sendPoll()` send location and poll messages. * `this.sendChatAction("typing")` sends a chat action. +* `this.withChatAction("typing", callback)` keeps a chat action active while an asynchronous operation runs. * `this.react("👍")` reacts to the current message. * `this.clearChat()` clears chat with user. @@ -510,6 +511,12 @@ await this.reply({ await this.react(["👍", "🔥"], { is_big: true }); +const answer = await this.withChatAction("typing", async () => { + return generateAnswer(); +}); + +await this.send({ text: answer }); + await this.api("sendMessageDraft", { chat_id: this.ctx.chatId, draft_id: 1, @@ -517,6 +524,37 @@ await this.api("sendMessageDraft", { }); ``` +For an entire action or message handler, the same behavior can be declared without a wrapper: + +```ts +actions: { + generate: { + chatAction: "typing", + async handler() { + const answer = await generateAnswer(); + await this.send({ text: answer }); + } + } +} +``` + +`chatAction` is opt-in and defaults to `undefined`, preserving the previous behavior. TBF refreshes the status every four seconds and always stops the timer when the operation completes or throws. + +To also stop the current status immediately when navigating to another action, page, or plugin, enable navigation tracking: + +```ts +TBF({ + telegram: { token }, + config: { + chatActions: { + stopOnNavigation: true + } + } +}); +``` + +The option defaults to `false`. Telegram Bot API has no explicit cancel operation: TBF stops refreshing the status, and Telegram removes it within five seconds or as soon as the bot sends a new message. + ### Combine callback and message handlers. We can imagine a little action that asks for user's name. diff --git a/lib/config.d.ts b/lib/config.d.ts index a2a9314..5369758 100644 --- a/lib/config.d.ts +++ b/lib/config.d.ts @@ -13,6 +13,9 @@ type ResolvedTBFConfig = { gracefulShutdown: { handleSignals: boolean; }; + chatActions: { + stopOnNavigation: boolean; + }; webServer: { port: number; address: string; diff --git a/lib/config.js b/lib/config.js index 8b6cff1..932892c 100644 --- a/lib/config.js +++ b/lib/config.js @@ -17,6 +17,9 @@ function resolveConfig(config = {}, cwd = process.cwd()) { gracefulShutdown: { handleSignals: config.gracefulShutdown?.handleSignals ?? false, }, + chatActions: { + stopOnNavigation: config.chatActions?.stopOnNavigation ?? false, + }, webServer: { port: config.webServer?.port ?? 8080, address: (config.webServer?.address ?? "").replace("//localhost", "//127.0.0.1"), diff --git a/lib/config.js.map b/lib/config.js.map index 7f61de8..826d1e3 100644 --- a/lib/config.js.map +++ b/lib/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;QA0CS,aAAa;AA1CtB,yCAAoC;AAoBpC,SAAS,aAAa,CAAC,MAAM,GAAc,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC9D,OAAO;QACH,KAAK,EAAE;YACH,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,IAAA,mBAAO,EAAC,GAAG,EAAE,SAAS,CAAC;SACtD;QACD,OAAO,EAAE;YACL,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAA,mBAAO,EAAC,GAAG,EAAE,WAAW,CAAC;SAC1D;QACD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,IAAI;QACrD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,IAAI;QACvD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;QAC7C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,gBAAgB,EAAE;YACd,aAAa,EAAE,MAAM,CAAC,gBAAgB,EAAE,aAAa,IAAI,KAAK;SACjE;QACD,SAAS,EAAE;YACP,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,IAAI;YACpC,OAAO,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC;SACnF;KACJ,CAAC;AACN,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;QAgDS,aAAa;AAhDtB,yCAAoC;AAuBpC,SAAS,aAAa,CAAC,MAAM,GAAc,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC9D,OAAO;QACH,KAAK,EAAE;YACH,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,IAAA,mBAAO,EAAC,GAAG,EAAE,SAAS,CAAC;SACtD;QACD,OAAO,EAAE;YACL,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAA,mBAAO,EAAC,GAAG,EAAE,WAAW,CAAC;SAC1D;QACD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,IAAI;QACrD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,IAAI;QACvD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;QAC7C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,gBAAgB,EAAE;YACd,aAAa,EAAE,MAAM,CAAC,gBAAgB,EAAE,aAAa,IAAI,KAAK;SACjE;QACD,WAAW,EAAE;YACT,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,gBAAgB,IAAI,KAAK;SAClE;QACD,SAAS,EAAE;YACP,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,IAAI;YACpC,OAAO,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC;SACnF;KACJ,CAAC;AACN,CAAC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 619adab..a561b44 100644 --- a/lib/index.js +++ b/lib/index.js @@ -24,7 +24,7 @@ let Create = async ({ webServer, telegram, storage, mongo, config }) => { config: resolvedConfig, }); const db = (0, db_1.default)(bot, database, resolvedConfig); - const { pages, plugins } = (0, page_loader_1.default)({ db, config: resolvedConfig }); + const { pages, plugins, stopChatActions } = (0, page_loader_1.default)({ db, config: resolvedConfig }); const components = [...pages, ...plugins]; bot.use((0, set_ids_1.default)()); if (resolvedConfig.spamProtection) @@ -88,6 +88,8 @@ let Create = async ({ webServer, telegram, storage, mongo, config }) => { const foundPage = components.find(component => component.id === page); if (!foundPage) throw new Error("Component not found: " + page); + if (resolvedConfig.chatActions.stopOnNavigation) + stopChatActions(ctx); await foundPage.open?.({ ctx, data, action, clearChat }); return true; }, diff --git a/lib/index.js.map b/lib/index.js.map index 58d3700..96204de 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/page_loader.d.ts b/lib/page_loader.d.ts index ad1cf00..150a134 100644 --- a/lib/page_loader.d.ts +++ b/lib/page_loader.d.ts @@ -1,4 +1,4 @@ -import type { Component, DB, TBFConfig, PaginatorReturn } from "./types"; +import type { TBFContext, Component, DB, TBFConfig, PaginatorReturn } from "./types"; export default _default; declare function _default({ db, config }: { db: DB; @@ -7,4 +7,5 @@ declare function _default({ db, config }: { pages: Component[]; plugins: Component[]; paginator: PaginatorReturn; + stopChatActions: (ctx: TBFContext) => void; }; diff --git a/lib/page_loader.js b/lib/page_loader.js index 154acd4..27f0c1b 100644 --- a/lib/page_loader.js +++ b/lib/page_loader.js @@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); const data_packer_1 = __importDefault(require("./data_packer")); const paginator_1 = __importDefault(require("./paginator")); -function loader({ db, config, inputComponents, componentType, loadedComponents }) { +function loader({ db, config, inputComponents, componentType, loadedComponents, chatActionManager }) { async function sendApiMessage(binding, method, payload) { const result = await binding.api(method, payload); const messages = Array.isArray(result) ? result : [result]; @@ -88,6 +88,12 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } let action_fn = typeof action == "function" ? action : action.handler; return action_fn; } + async function runAction(action, actionBinding, callback) { + const chatAction = action?.chatAction; + if (!chatAction) + return callback(); + return actionBinding.withChatAction(chatAction, async () => callback(), action.chatActionOptions); + } let components = []; for (let page of inputComponents) { let pageObject; @@ -195,6 +201,29 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } async sendChatAction(action, options = {}) { return this.api("sendChatAction", { chat_id: this.ctx.chatId, action, ...options }); }, + async withChatAction(action, callback, options = {}) { + const { intervalDuration = 4000, ...apiOptions } = options; + const sendStatus = async () => { + try { + await this.sendChatAction(action, apiOptions); + } + catch (error) { + if (config.debug) + console.warn("[withChatAction] Unable to send chat action:", error); + } + }; + await sendStatus(); + const timer = setInterval(sendStatus, intervalDuration); + timer.unref?.(); + const unregister = chatActionManager.register(this.ctx, () => clearInterval(timer)); + try { + return await callback(); + } + finally { + clearInterval(timer); + unregister(); + } + }, async react(reaction, options = {}) { const messageId = this.ctx.message?.message_id ?? this.ctx.callbackQuery?.message?.message_id; if (!messageId) @@ -272,10 +301,13 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } let _this = this; let found_component = loadedComponents.find(x => x.id == component && x.type == type); if (found_component) { + if (config.chatActions?.stopOnNavigation) + chatActionManager.stop(_this.ctx); await db.setValue(_this.ctx, "step", component + "�" + action); let action_fn = extractHandler(found_component.actions[action]); try { - return await action_fn.bind({ ..._this, ...{ id: component } })({ ctx: _this.ctx, data }); + const actionBinding = { ..._this, ...{ id: component } }; + return await runAction(found_component.actions[action], actionBinding, () => action_fn.bind(actionBinding)({ ctx: _this.ctx, data })); } catch (error) { console.error("goToComponent error", error); @@ -297,10 +329,13 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } let current_page = loadedComponents.find(x => x.id == _this.id); let page_action = current_page.actions[action]; if (page_action) { + if (config.chatActions?.stopOnNavigation) + chatActionManager.stop(_this.ctx); await db.setValue(_this.ctx, "step", _this.id + "�" + action); let action_fn = extractHandler(page_action); try { - return await action_fn.bind({ ..._this, ...{ id: _this.id } })({ ctx: _this.ctx, data }); + const actionBinding = { ..._this, ...{ id: _this.id } }; + return await runAction(page_action, actionBinding, () => action_fn.bind(actionBinding)({ ctx: _this.ctx, data })); } catch (error) { console.error("goToAction error", error); @@ -406,6 +441,9 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } async sendChatAction(action, options) { return binding.sendChatAction.bind(userBinding)(action, options); }, + async withChatAction(action, callback, options) { + return binding.withChatAction.bind(userBinding)(action, callback, options); + }, async react(reaction, options) { return binding.react.bind(userBinding)(reaction, options); }, @@ -437,7 +475,8 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } await db.messages.removeMessages(ctx); let action_fn = extractHandler(action); await db.setValue(ctx, "step", pageObject.id + "�" + ctx_action); - await action_fn.bind({ ...binding, ctx })({ ctx, data: ctx.routing.data }); + const actionBinding = { ...binding, ctx }; + await runAction(action, actionBinding, () => action_fn.bind(actionBinding)({ ctx, data: ctx.routing.data })); } else { throw ("action not found: " + ctx_action); @@ -467,7 +506,8 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } await db.setValue(ctx, "from", ctx.from); } let handler_fn = extractHandler(handler); - let result = await handler_fn.bind({ ...binding, ctx })({ + const actionBinding = { ...binding, ctx }; + let result = await runAction(handler, actionBinding, () => handler_fn.bind(actionBinding)({ ctx, text: "text" in ctx.message ? ctx.message.text : undefined, photo: "photo" in ctx.message ? ctx.message.photo : undefined, @@ -485,7 +525,7 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } invoice: "invoice" in ctx.message ? ctx.message.invoice : undefined, dice: "dice" in ctx.message ? ctx.message.dice : undefined, caption: "caption" in ctx.message ? ctx.message.caption : undefined, - }); + })); if (typeof result === "boolean") { if (!result) { await db.messages.removeMessages(ctx, true); @@ -527,7 +567,8 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } if (shouldClearChat) await db.messages.removeMessages(ctx); await db.setValue(ctx, "step", pageObject.id + "�" + act); - await action_fn.bind({ ...binding, ctx })({ ctx, data }); + const actionBinding = { ...binding, ctx }; + await runAction(pageObject.actions[act], actionBinding, () => action_fn.bind(actionBinding)({ ctx, data })); }; components.push({ ...pageObject, type: componentType }); } @@ -536,14 +577,35 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } exports.default = ({ db, config }) => { let loadedComponents = []; let paginator = (0, paginator_1.default)({ config }); + const activeChatActions = new WeakMap(); + const chatActionManager = { + register(ctx, stop) { + const stops = activeChatActions.get(ctx) ?? new Set(); + stops.add(stop); + activeChatActions.set(ctx, stops); + return () => { + stops.delete(stop); + if (stops.size === 0) + activeChatActions.delete(ctx); + }; + }, + stop(ctx) { + const stops = activeChatActions.get(ctx); + if (!stops) + return; + activeChatActions.delete(ctx); + for (const stop of stops) + stop(); + }, + }; let pages_components = paginator.list("pages"); - let pages = loader({ db, config, inputComponents: pages_components, componentType: 'page', loadedComponents }).components; + let pages = loader({ db, config, inputComponents: pages_components, componentType: 'page', loadedComponents, chatActionManager }).components; loadedComponents.push(...pages); console.log("✅", `Loader: ${pages.length} ${pages.length == 1 ? 'page' : 'pages'} loaded!`); let plugins_components = paginator.list("plugins"); - let plugins = loader({ db, config, inputComponents: plugins_components, componentType: 'plugin', loadedComponents }).components; + let plugins = loader({ db, config, inputComponents: plugins_components, componentType: 'plugin', loadedComponents, chatActionManager }).components; loadedComponents.push(...plugins); console.log("✅", `Loader: ${plugins.length} ${plugins.length == 1 ? 'plugin' : 'plugins'} loaded!`); - return { pages, plugins, paginator }; + return { pages, plugins, paginator, stopChatActions: chatActionManager.stop }; }; //# sourceMappingURL=page_loader.js.map \ No newline at end of file diff --git a/lib/page_loader.js.map b/lib/page_loader.js.map index c2244eb..e926c84 100644 --- a/lib/page_loader.js.map +++ b/lib/page_loader.js.map @@ -1 +1 @@ -{"version":3,"file":"page_loader.js","sourceRoot":"","sources":["../src/page_loader.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"page_loader.js","sourceRoot":"","sources":["../src/page_loader.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/types/index.d.ts b/lib/types/index.d.ts index dfb03be..61207ef 100644 --- a/lib/types/index.d.ts +++ b/lib/types/index.d.ts @@ -91,6 +91,11 @@ type ComponentActionHandlerThisUpdateArg = { keyboard?: Keyboard } +type ChatAction = Parameters[0]; +type ChatActionOptions = Record & { + intervalDuration?: number; +}; + type goToData = any; type pluginGoToData = { callback?: { @@ -120,7 +125,8 @@ interface ComponentActionHandlerThisMethods { sendSticker: (arg: { sticker: any, options?: Record }) => Promise; sendLocation: (arg: { latitude: number, longitude: number, options?: Record }) => Promise; sendPoll: (arg: { question: string, options: any[], extra?: Record }) => Promise; - sendChatAction: (action: string, options?: Record) => Promise; + sendChatAction: (action: ChatAction, options?: Record) => Promise; + withChatAction: (action: ChatAction, callback: () => Promise | T, options?: ChatActionOptions) => Promise; react: (reaction: string | Record | Array>, options?: Record) => Promise; api: (method: string, payload?: Record) => Promise; goToAction: (arg: { action: string, data?: goToData }) => Promise; @@ -155,19 +161,27 @@ type ComponentActionHandlerThis = { interface ComponentActionMessageHandler { (this: ComponentActionHandlerThis, arg: ComponentActionArg): any; clearChat?: boolean; + chatAction?: ChatAction; + chatActionOptions?: ChatActionOptions; } interface ComponentActionHandler { (this: ComponentActionHandlerThis, arg: ComponentActionArg): any; clearChat?: boolean; + chatAction?: ChatAction; + chatActionOptions?: ChatActionOptions; messageHandler?: ComponentActionMessageHandler; } type ComponentAction = ComponentActionHandler | { clearChat?: boolean; + chatAction?: ChatAction; + chatActionOptions?: ChatActionOptions; handler: ComponentActionHandler; messageHandler?: ComponentActionMessageHandler | { clearChat?: boolean; + chatAction?: ChatAction; + chatActionOptions?: ChatActionOptions; handler: ComponentActionMessageHandler; } } @@ -334,6 +348,9 @@ interface TBFConfig { gracefulShutdown?: { handleSignals?: boolean; }; + chatActions?: { + stopOnNavigation?: boolean; + }; webServer?: { port: any; address: string; @@ -405,5 +422,7 @@ export { PluginButton, StorageConfig, StorageDatabase, - StorageCollection + StorageCollection, + ChatAction, + ChatActionOptions } diff --git a/src/config.ts b/src/config.ts index 27ef1bf..84bb4a4 100644 --- a/src/config.ts +++ b/src/config.ts @@ -12,6 +12,9 @@ type ResolvedTBFConfig = { gracefulShutdown: { handleSignals: boolean; }; + chatActions: { + stopOnNavigation: boolean; + }; webServer: { port: number; address: string; @@ -33,6 +36,9 @@ function resolveConfig(config: TBFConfig = {}, cwd = process.cwd()): ResolvedTBF gracefulShutdown: { handleSignals: config.gracefulShutdown?.handleSignals ?? false, }, + chatActions: { + stopOnNavigation: config.chatActions?.stopOnNavigation ?? false, + }, webServer: { port: config.webServer?.port ?? 8080, address: (config.webServer?.address ?? "").replace("//localhost", "//127.0.0.1"), diff --git a/src/index.ts b/src/index.ts index 0c28b6f..6123604 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,7 +29,7 @@ let Create = async ({ webServer, telegram, storage, mongo, config }: TBFArgs): P config: resolvedConfig, } as TBFArgs); const db: DB = DBInstance(bot, database, resolvedConfig); - const { pages, plugins }: { pages: Component[], plugins: Component[] } = PageLoader({ db, config: resolvedConfig }); + const { pages, plugins, stopChatActions } = PageLoader({ db, config: resolvedConfig }); const components = [...pages, ...plugins]; bot.use(Middleware_SetIds()); @@ -92,6 +92,7 @@ let Create = async ({ webServer, telegram, storage, mongo, config }: TBFArgs): P async openPage({ ctx, page, data, action = "main", clearChat }) { const foundPage = components.find(component => component.id === page); if (!foundPage) throw new Error("Component not found: " + page); + if (resolvedConfig.chatActions.stopOnNavigation) stopChatActions(ctx); await foundPage.open?.({ ctx, data, action, clearChat }); return true; }, diff --git a/src/page_loader.ts b/src/page_loader.ts index 45de32e..460b561 100644 --- a/src/page_loader.ts +++ b/src/page_loader.ts @@ -10,6 +10,8 @@ import type { PaginatorComponent, ParseButtons, ParseButtonsReturn, + ChatAction, + ChatActionOptions, } from "./types" import dataPacker from "./data_packer" @@ -20,14 +22,20 @@ type loaderArgs = { config: TBFConfig, inputComponents: PaginatorComponent[], componentType: string, - loadedComponents: Component[] + loadedComponents: Component[]; + chatActionManager: ChatActionManager; } type loaderReturn = { components: Component[] } -function loader({ db, config, inputComponents, componentType, loadedComponents }: loaderArgs): loaderReturn { +type ChatActionManager = { + register(ctx: TBFContext, stop: () => void): () => void; + stop(ctx: TBFContext): void; +} + +function loader({ db, config, inputComponents, componentType, loadedComponents, chatActionManager }: loaderArgs): loaderReturn { async function sendApiMessage(binding: ComponentActionHandlerThis, method: string, payload: Record) { const result = await binding.api(method, payload); const messages = Array.isArray(result) ? result : [result]; @@ -112,6 +120,16 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } return action_fn; } + async function runAction( + action: { chatAction?: ChatAction, chatActionOptions?: ChatActionOptions }, + actionBinding: ComponentActionHandlerThis, + callback: () => Promise | T, + ): Promise { + const chatAction = action?.chatAction; + if (!chatAction) return callback(); + return actionBinding.withChatAction(chatAction, async () => callback(), action.chatActionOptions); + } + let components: Component[] = []; for (let page of inputComponents) { @@ -215,6 +233,27 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } async sendChatAction(this: ComponentActionHandlerThis, action, options = {}) { return this.api("sendChatAction", { chat_id: this.ctx.chatId, action, ...options }); }, + async withChatAction(this: ComponentActionHandlerThis, action: ChatAction, callback: () => Promise | T, options: ChatActionOptions = {}): Promise { + const { intervalDuration = 4000, ...apiOptions } = options; + const sendStatus = async () => { + try { + await this.sendChatAction(action, apiOptions); + } catch (error) { + if (config.debug) console.warn("[withChatAction] Unable to send chat action:", error); + } + }; + + await sendStatus(); + const timer = setInterval(sendStatus, intervalDuration); + timer.unref?.(); + const unregister = chatActionManager.register(this.ctx, () => clearInterval(timer)); + try { + return await callback(); + } finally { + clearInterval(timer); + unregister(); + } + }, async react(this: ComponentActionHandlerThis, reaction, options = {}) { const messageId = this.ctx.message?.message_id ?? this.ctx.callbackQuery?.message?.message_id; if (!messageId) throw new Error("react() requires a message context or message_id"); @@ -294,10 +333,14 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } let _this: ComponentActionHandlerThis = this; let found_component = loadedComponents.find(x => x.id == component && x.type == type); if (found_component) { + if (config.chatActions?.stopOnNavigation) chatActionManager.stop(_this.ctx); await db.setValue(_this.ctx, "step", component + "�" + action); let action_fn = extractHandler(found_component.actions[action]); try { - return await action_fn.bind({ ..._this, ...{ id: component } })({ ctx: _this.ctx, data }); + const actionBinding = { ..._this, ...{ id: component } }; + return await runAction(found_component.actions[action], actionBinding, () => + action_fn.bind(actionBinding)({ ctx: _this.ctx, data }) + ); } catch (error) { console.error("goToComponent error", error); return null; @@ -317,10 +360,14 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } let current_page = loadedComponents.find(x => x.id == _this.id); let page_action = current_page.actions[action]; if (page_action) { + if (config.chatActions?.stopOnNavigation) chatActionManager.stop(_this.ctx); await db.setValue(_this.ctx, "step", _this.id + "�" + action); let action_fn = extractHandler(page_action); try { - return await action_fn.bind({ ..._this, ...{ id: _this.id } })({ ctx: _this.ctx, data }); + const actionBinding = { ..._this, ...{ id: _this.id } }; + return await runAction(page_action, actionBinding, () => + action_fn.bind(actionBinding)({ ctx: _this.ctx, data }) + ); } catch (error) { console.error("goToAction error", error); return null; @@ -425,6 +472,9 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } async sendChatAction(action, options) { return binding.sendChatAction.bind(userBinding)(action, options); }, + async withChatAction(action, callback, options) { + return binding.withChatAction.bind(userBinding)(action, callback, options); + }, async react(reaction, options) { return binding.react.bind(userBinding)(reaction, options); }, @@ -454,7 +504,10 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } if (action.clearChat) await db.messages.removeMessages(ctx); let action_fn = extractHandler(action); await db.setValue(ctx, "step", pageObject.id + "�" + ctx_action); - await action_fn.bind({ ...binding, ctx })({ ctx, data: ctx.routing.data }); + const actionBinding = { ...binding, ctx }; + await runAction(action, actionBinding, () => + action_fn.bind(actionBinding)({ ctx, data: ctx.routing.data }) + ); } else { throw ("action not found: " + ctx_action); } @@ -478,25 +531,27 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } await db.setValue(ctx, "from", ctx.from); } let handler_fn = extractHandler(handler); - let result = await handler_fn.bind({ ...binding, ctx })({ - ctx, - text: "text" in ctx.message ? ctx.message.text : undefined, - photo: "photo" in ctx.message ? ctx.message.photo : undefined, - video: "video" in ctx.message ? ctx.message.video : undefined, - animation: "animation" in ctx.message ? ctx.message.animation : undefined, - document: "document" in ctx.message ? ctx.message.document : undefined, - voice: "voice" in ctx.message ? ctx.message.voice : undefined, - audio: "audio" in ctx.message ? ctx.message.audio : undefined, - poll: "poll" in ctx.message ? ctx.message.poll : undefined, - sticker: "sticker" in ctx.message ? ctx.message.sticker : undefined, - location: "location" in ctx.message ? ctx.message.location : undefined, - contact: "contact" in ctx.message ? ctx.message.contact : undefined, - venue: "venue" in ctx.message ? ctx.message.venue : undefined, - game: "game" in ctx.message ? ctx.message.game : undefined, - invoice: "invoice" in ctx.message ? ctx.message.invoice : undefined, - dice: "dice" in ctx.message ? ctx.message.dice : undefined, - caption: "caption" in ctx.message ? ctx.message.caption : undefined, - }); + const actionBinding = { ...binding, ctx }; + let result = await runAction(handler, actionBinding, () => handler_fn.bind(actionBinding)({ + ctx, + text: "text" in ctx.message ? ctx.message.text : undefined, + photo: "photo" in ctx.message ? ctx.message.photo : undefined, + video: "video" in ctx.message ? ctx.message.video : undefined, + animation: "animation" in ctx.message ? ctx.message.animation : undefined, + document: "document" in ctx.message ? ctx.message.document : undefined, + voice: "voice" in ctx.message ? ctx.message.voice : undefined, + audio: "audio" in ctx.message ? ctx.message.audio : undefined, + poll: "poll" in ctx.message ? ctx.message.poll : undefined, + sticker: "sticker" in ctx.message ? ctx.message.sticker : undefined, + location: "location" in ctx.message ? ctx.message.location : undefined, + contact: "contact" in ctx.message ? ctx.message.contact : undefined, + venue: "venue" in ctx.message ? ctx.message.venue : undefined, + game: "game" in ctx.message ? ctx.message.game : undefined, + invoice: "invoice" in ctx.message ? ctx.message.invoice : undefined, + dice: "dice" in ctx.message ? ctx.message.dice : undefined, + caption: "caption" in ctx.message ? ctx.message.caption : undefined, + }) + ); if (typeof result === "boolean") { if (!result) { await db.messages.removeMessages(ctx, true); @@ -534,7 +589,10 @@ function loader({ db, config, inputComponents, componentType, loadedComponents } const shouldClearChat = clearChat ?? pageObject.clearChatOnOpen ?? config.clearChatOnPageOpen ?? true; if (shouldClearChat) await db.messages.removeMessages(ctx); await db.setValue(ctx, "step", pageObject.id + "�" + act); - await action_fn.bind({ ...binding, ctx })({ ctx, data }); + const actionBinding = { ...binding, ctx }; + await runAction(pageObject.actions[act], actionBinding, () => + action_fn.bind(actionBinding)({ ctx, data }) + ); } components.push({ ...pageObject, type: componentType }); } @@ -547,16 +605,34 @@ export default ( ) => { let loadedComponents: Component[] = []; let paginator: PaginatorReturn = Paginator({ config }); + const activeChatActions = new WeakMap void>>(); + const chatActionManager: ChatActionManager = { + register(ctx, stop) { + const stops = activeChatActions.get(ctx) ?? new Set(); + stops.add(stop); + activeChatActions.set(ctx, stops); + return () => { + stops.delete(stop); + if (stops.size === 0) activeChatActions.delete(ctx); + }; + }, + stop(ctx) { + const stops = activeChatActions.get(ctx); + if (!stops) return; + activeChatActions.delete(ctx); + for (const stop of stops) stop(); + }, + }; let pages_components = paginator.list("pages") - let pages = loader({ db, config, inputComponents: pages_components, componentType: 'page', loadedComponents }).components; + let pages = loader({ db, config, inputComponents: pages_components, componentType: 'page', loadedComponents, chatActionManager }).components; loadedComponents.push(...pages); console.log("✅", `Loader: ${pages.length} ${pages.length == 1 ? 'page' : 'pages'} loaded!`); let plugins_components = paginator.list("plugins") - let plugins = loader({ db, config, inputComponents: plugins_components, componentType: 'plugin', loadedComponents }).components; + let plugins = loader({ db, config, inputComponents: plugins_components, componentType: 'plugin', loadedComponents, chatActionManager }).components; loadedComponents.push(...plugins); console.log("✅", `Loader: ${plugins.length} ${plugins.length == 1 ? 'plugin' : 'plugins'} loaded!`); - return { pages, plugins, paginator }; + return { pages, plugins, paginator, stopChatActions: chatActionManager.stop }; } diff --git a/src/types/index.d.ts b/src/types/index.d.ts index dfb03be..61207ef 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -91,6 +91,11 @@ type ComponentActionHandlerThisUpdateArg = { keyboard?: Keyboard } +type ChatAction = Parameters[0]; +type ChatActionOptions = Record & { + intervalDuration?: number; +}; + type goToData = any; type pluginGoToData = { callback?: { @@ -120,7 +125,8 @@ interface ComponentActionHandlerThisMethods { sendSticker: (arg: { sticker: any, options?: Record }) => Promise; sendLocation: (arg: { latitude: number, longitude: number, options?: Record }) => Promise; sendPoll: (arg: { question: string, options: any[], extra?: Record }) => Promise; - sendChatAction: (action: string, options?: Record) => Promise; + sendChatAction: (action: ChatAction, options?: Record) => Promise; + withChatAction: (action: ChatAction, callback: () => Promise | T, options?: ChatActionOptions) => Promise; react: (reaction: string | Record | Array>, options?: Record) => Promise; api: (method: string, payload?: Record) => Promise; goToAction: (arg: { action: string, data?: goToData }) => Promise; @@ -155,19 +161,27 @@ type ComponentActionHandlerThis = { interface ComponentActionMessageHandler { (this: ComponentActionHandlerThis, arg: ComponentActionArg): any; clearChat?: boolean; + chatAction?: ChatAction; + chatActionOptions?: ChatActionOptions; } interface ComponentActionHandler { (this: ComponentActionHandlerThis, arg: ComponentActionArg): any; clearChat?: boolean; + chatAction?: ChatAction; + chatActionOptions?: ChatActionOptions; messageHandler?: ComponentActionMessageHandler; } type ComponentAction = ComponentActionHandler | { clearChat?: boolean; + chatAction?: ChatAction; + chatActionOptions?: ChatActionOptions; handler: ComponentActionHandler; messageHandler?: ComponentActionMessageHandler | { clearChat?: boolean; + chatAction?: ChatAction; + chatActionOptions?: ChatActionOptions; handler: ComponentActionMessageHandler; } } @@ -334,6 +348,9 @@ interface TBFConfig { gracefulShutdown?: { handleSignals?: boolean; }; + chatActions?: { + stopOnNavigation?: boolean; + }; webServer?: { port: any; address: string; @@ -405,5 +422,7 @@ export { PluginButton, StorageConfig, StorageDatabase, - StorageCollection + StorageCollection, + ChatAction, + ChatActionOptions } diff --git a/test/config.test.ts b/test/config.test.ts index c013ae2..54e897f 100644 --- a/test/config.test.ts +++ b/test/config.test.ts @@ -15,6 +15,7 @@ test("config defaults preserve historical TBF behavior", () => { spamProtection: true, debug: false, gracefulShutdown: { handleSignals: false }, + chatActions: { stopOnNavigation: false }, webServer: { port: 8080, address: "" }, }); }); @@ -25,12 +26,14 @@ test("config preserves explicit false values and merges nested defaults", () => clearChatOnPageOpen: false, spamProtection: false, gracefulShutdown: { handleSignals: false }, + chatActions: { stopOnNavigation: true }, webServer: { address: "http://localhost:3000" } as never, }, "/tmp/tbf-app"); assert.equal(config.autoRemoveMessages, false); assert.equal(config.clearChatOnPageOpen, false); assert.equal(config.spamProtection, false); + assert.equal(config.chatActions.stopOnNavigation, true); assert.deepEqual(config.webServer, { port: 8080, address: "http://127.0.0.1:3000", diff --git a/test/page_loader.test.ts b/test/page_loader.test.ts index c8b3d2c..ae60eca 100644 --- a/test/page_loader.test.ts +++ b/test/page_loader.test.ts @@ -15,7 +15,13 @@ test("page loader builds routes, persists oversized data, and opens a page", asy writeFileSync(join(pagesPath, "index.js"), ` module.exports = ({ parseButtons }) => ({ clearChatOnOpen: false, - actions: { main({ data }) { globalThis.__tbfOpenedWith = data; globalThis.__tbfBinding = this; } }, + actions: { + main({ data }) { globalThis.__tbfOpenedWith = data; globalThis.__tbfBinding = this; }, + generate: { + chatAction: "typing", + async handler() { globalThis.__tbfGenerated = true; } + } + }, events: { message_reaction(ctx) { globalThis.__tbfReactionEvent = { ctx, binding: this }; } }, @@ -58,6 +64,7 @@ test("page loader builds routes, persists oversized data, and opens a page", asy config: { pages: { path: pagesPath }, plugins: { path: pluginsPath }, + chatActions: { stopOnNavigation: true }, webServer: { address: "https://example.test", port: 8080 }, }, }); @@ -107,6 +114,40 @@ test("page loader builds routes, persists oversized data, and opens a page", asy action: "typing", message_thread_id: 5, }]); + + const generated = await binding.withChatAction("typing", async () => "generated", { + message_thread_id: 5, + intervalDuration: 10000, + }); + assert.equal(generated, "generated"); + assert.deepEqual(apiCalls[3], ["sendChatAction", { + chat_id: 77, + action: "typing", + message_thread_id: 5, + }]); + + const statusCallsBeforeRefresh = apiCalls.length; + await binding.withChatAction("typing", async () => { + await new Promise(resolve => setTimeout(resolve, 18)); + }, { intervalDuration: 5 }); + const statusCallsAfterRefresh = apiCalls.length; + assert.ok(statusCallsAfterRefresh >= statusCallsBeforeRefresh + 2); + await new Promise(resolve => setTimeout(resolve, 12)); + assert.equal(apiCalls.length, statusCallsAfterRefresh); + + await binding.withChatAction("typing", async () => { + await binding.goToAction({ action: "generate" }); + const callsAfterNavigation = apiCalls.length; + await new Promise(resolve => setTimeout(resolve, 12)); + assert.equal(apiCalls.length, callsAfterNavigation); + }, { intervalDuration: 5 }); + + await page.open?.({ ctx, action: "generate", data: undefined }); + assert.equal((globalThis as any).__tbfGenerated, true); + assert.deepEqual(apiCalls.at(-1), ["sendChatAction", { + chat_id: 77, + action: "typing", + }]); assert.ok(calls.some(call => call[0] === "track" && (call[2] as any[])[0].message_id === 900)); assert.ok(calls.some(call => call[0] === "sendMessage" && (call[3] as any).reply_parameters.message_id === 12 @@ -120,6 +161,7 @@ test("page loader builds routes, persists oversized data, and opens a page", asy delete (globalThis as any).__tbfOpenedWith; delete (globalThis as any).__tbfBinding; delete (globalThis as any).__tbfReactionEvent; + delete (globalThis as any).__tbfGenerated; rmSync(root, { recursive: true, force: true }); } }); From fc5860a9a391a77a37c7c76cd61f68976e0c89fb Mon Sep 17 00:00:00 2001 From: powerdot Date: Mon, 13 Jul 2026 16:46:28 +0400 Subject: [PATCH 3/3] 2.0.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65b64a0..581d291 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@powerdot/telegram_bot_framework", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@powerdot/telegram_bot_framework", - "version": "2.0.0", + "version": "2.0.1", "license": "ISC", "dependencies": { "@types/express": "^5.0.6", diff --git a/package.json b/package.json index b2a071f..8fa22ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@powerdot/telegram_bot_framework", - "version": "2.0.0", + "version": "2.0.1", "description": "A component-oriented Telegram bot framework built on Telegraf", "main": "lib/index.js", "types": "lib/index.d.ts",