@xbibzlibrary/telebibz 0.4.4 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -138
- package/LICENSE +1 -1
- package/NOTICE.md +9 -4
- package/README.md +173 -242
- package/examples/01-quickstart.js +13 -0
- package/examples/02-menu-tombol.js +22 -0
- package/examples/03-wizard.js +29 -0
- package/examples/04-broadcast.js +25 -0
- package/examples/05-kirim-file.js +19 -0
- package/examples/06-menu.js +35 -0
- package/examples/07-inline-query.js +18 -0
- package/index.d.ts +81 -0
- package/index.js +42 -0
- package/lib/api.js +154 -0
- package/lib/broadcast.js +35 -0
- package/lib/composer.js +174 -0
- package/lib/context.js +190 -0
- package/lib/errors.js +35 -0
- package/lib/file.js +41 -0
- package/lib/inline-query.js +28 -0
- package/lib/keyboard.js +83 -0
- package/lib/logger.js +38 -0
- package/lib/menus.js +90 -0
- package/lib/net.js +115 -0
- package/lib/ratelimit.js +61 -0
- package/lib/runner.js +45 -0
- package/lib/session.js +36 -0
- package/lib/telebibz.js +190 -0
- package/lib/wizard.js +81 -0
- package/package.json +35 -97
- package/test/all.test.js +334 -0
- package/CODE_OF_CONDUCT.md +0 -37
- package/CONTRIBUTING.md +0 -59
- package/CONTRIBUTION_RULES.md +0 -41
- package/GOVERNANCE.md +0 -47
- package/README.id.md +0 -292
- package/README.zh-CN.md +0 -292
- package/RELEASE_AUTOMATION.md +0 -78
- package/RELEASE_POLICY.md +0 -32
- package/SECURITY.md +0 -47
- package/SHOWCASE.md +0 -29
- package/SUPPORT.md +0 -30
- package/assets/readme-preview.html +0 -75
- package/assets/telebibz-logo.png +0 -0
- package/assets/telebibz-readme-preview.png +0 -0
- package/bin/telebibz.mjs +0 -3
- package/dist/generated/api.d.ts +0 -13
- package/dist/generated/api.d.ts.map +0 -1
- package/dist/generated/api.js +0 -192
- package/dist/generated/api.js.map +0 -1
- package/dist/src/api/client.d.ts +0 -62
- package/dist/src/api/client.d.ts.map +0 -1
- package/dist/src/api/client.js +0 -104
- package/dist/src/api/client.js.map +0 -1
- package/dist/src/api/errors.d.ts +0 -45
- package/dist/src/api/errors.d.ts.map +0 -1
- package/dist/src/api/errors.js +0 -65
- package/dist/src/api/errors.js.map +0 -1
- package/dist/src/api/index.d.ts +0 -6
- package/dist/src/api/index.d.ts.map +0 -1
- package/dist/src/api/index.js +0 -6
- package/dist/src/api/index.js.map +0 -1
- package/dist/src/api/telegram-types/LICENSE +0 -21
- package/dist/src/api/telegram-types/api.d.ts +0 -22
- package/dist/src/api/telegram-types/checklist.d.ts +0 -72
- package/dist/src/api/telegram-types/inline.d.ts +0 -692
- package/dist/src/api/telegram-types/langs.d.ts +0 -193
- package/dist/src/api/telegram-types/manage.d.ts +0 -1144
- package/dist/src/api/telegram-types/markup.d.ts +0 -268
- package/dist/src/api/telegram-types/message.d.ts +0 -1537
- package/dist/src/api/telegram-types/methods.d.ts +0 -2870
- package/dist/src/api/telegram-types/mod.d.ts +0 -14
- package/dist/src/api/telegram-types/passport.d.ts +0 -163
- package/dist/src/api/telegram-types/payment.d.ts +0 -570
- package/dist/src/api/telegram-types/rich.d.ts +0 -1010
- package/dist/src/api/telegram-types/settings.d.ts +0 -120
- package/dist/src/api/telegram-types/story.d.ts +0 -89
- package/dist/src/api/telegram-types/update.d.ts +0 -84
- package/dist/src/api/telegram.d.ts +0 -7
- package/dist/src/api/telegram.d.ts.map +0 -1
- package/dist/src/api/telegram.js +0 -2
- package/dist/src/api/telegram.js.map +0 -1
- package/dist/src/api/transport.d.ts +0 -68
- package/dist/src/api/transport.d.ts.map +0 -1
- package/dist/src/api/transport.js +0 -264
- package/dist/src/api/transport.js.map +0 -1
- package/dist/src/api/types.d.ts +0 -466
- package/dist/src/api/types.d.ts.map +0 -1
- package/dist/src/api/types.js +0 -2
- package/dist/src/api/types.js.map +0 -1
- package/dist/src/branding/terminal.d.ts +0 -77
- package/dist/src/branding/terminal.d.ts.map +0 -1
- package/dist/src/branding/terminal.js +0 -328
- package/dist/src/branding/terminal.js.map +0 -1
- package/dist/src/broadcast/broadcast.d.ts +0 -50
- package/dist/src/broadcast/broadcast.d.ts.map +0 -1
- package/dist/src/broadcast/broadcast.js +0 -56
- package/dist/src/broadcast/broadcast.js.map +0 -1
- package/dist/src/cache/cache.d.ts +0 -34
- package/dist/src/cache/cache.d.ts.map +0 -1
- package/dist/src/cache/cache.js +0 -41
- package/dist/src/cache/cache.js.map +0 -1
- package/dist/src/cli.d.ts +0 -2
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -84
- package/dist/src/cli.js.map +0 -1
- package/dist/src/context/context.d.ts +0 -124
- package/dist/src/context/context.d.ts.map +0 -1
- package/dist/src/context/context.js +0 -302
- package/dist/src/context/context.js.map +0 -1
- package/dist/src/core/bot.d.ts +0 -204
- package/dist/src/core/bot.d.ts.map +0 -1
- package/dist/src/core/bot.js +0 -506
- package/dist/src/core/bot.js.map +0 -1
- package/dist/src/core/events.d.ts +0 -75
- package/dist/src/core/events.d.ts.map +0 -1
- package/dist/src/core/events.js +0 -35
- package/dist/src/core/events.js.map +0 -1
- package/dist/src/core/webhook-reply.d.ts +0 -34
- package/dist/src/core/webhook-reply.d.ts.map +0 -1
- package/dist/src/core/webhook-reply.js +0 -37
- package/dist/src/core/webhook-reply.js.map +0 -1
- package/dist/src/index.d.ts +0 -24
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -24
- package/dist/src/index.js.map +0 -1
- package/dist/src/keyboard/index.d.ts +0 -46
- package/dist/src/keyboard/index.d.ts.map +0 -1
- package/dist/src/keyboard/index.js +0 -55
- package/dist/src/keyboard/index.js.map +0 -1
- package/dist/src/middleware/compose.d.ts +0 -5
- package/dist/src/middleware/compose.d.ts.map +0 -1
- package/dist/src/middleware/compose.js +0 -17
- package/dist/src/middleware/compose.js.map +0 -1
- package/dist/src/observability/logger.d.ts +0 -78
- package/dist/src/observability/logger.d.ts.map +0 -1
- package/dist/src/observability/logger.js +0 -285
- package/dist/src/observability/logger.js.map +0 -1
- package/dist/src/plugins/plugin.d.ts +0 -38
- package/dist/src/plugins/plugin.d.ts.map +0 -1
- package/dist/src/plugins/plugin.js +0 -59
- package/dist/src/plugins/plugin.js.map +0 -1
- package/dist/src/queue/queue.d.ts +0 -77
- package/dist/src/queue/queue.d.ts.map +0 -1
- package/dist/src/queue/queue.js +0 -213
- package/dist/src/queue/queue.js.map +0 -1
- package/dist/src/router/router.d.ts +0 -61
- package/dist/src/router/router.d.ts.map +0 -1
- package/dist/src/router/router.js +0 -183
- package/dist/src/router/router.js.map +0 -1
- package/dist/src/state/conversation.d.ts +0 -56
- package/dist/src/state/conversation.d.ts.map +0 -1
- package/dist/src/state/conversation.js +0 -133
- package/dist/src/state/conversation.js.map +0 -1
- package/dist/src/state/forms.d.ts +0 -34
- package/dist/src/state/forms.d.ts.map +0 -1
- package/dist/src/state/forms.js +0 -44
- package/dist/src/state/forms.js.map +0 -1
- package/dist/src/state/menu.d.ts +0 -78
- package/dist/src/state/menu.d.ts.map +0 -1
- package/dist/src/state/menu.js +0 -127
- package/dist/src/state/menu.js.map +0 -1
- package/dist/src/storage/storage.d.ts +0 -146
- package/dist/src/storage/storage.d.ts.map +0 -1
- package/dist/src/storage/storage.js +0 -195
- package/dist/src/storage/storage.js.map +0 -1
- package/dist/src/telegram-features.d.ts +0 -33
- package/dist/src/telegram-features.d.ts.map +0 -1
- package/dist/src/telegram-features.js +0 -71
- package/dist/src/telegram-features.js.map +0 -1
- package/dist/src/testing.d.ts +0 -24
- package/dist/src/testing.d.ts.map +0 -1
- package/dist/src/testing.js +0 -38
- package/dist/src/testing.js.map +0 -1
- package/dist/src/utils/concurrency.d.ts +0 -25
- package/dist/src/utils/concurrency.d.ts.map +0 -1
- package/dist/src/utils/concurrency.js +0 -52
- package/dist/src/utils/concurrency.js.map +0 -1
- package/dist/src/utils/files.d.ts +0 -45
- package/dist/src/utils/files.d.ts.map +0 -1
- package/dist/src/utils/files.js +0 -53
- package/dist/src/utils/files.js.map +0 -1
- package/dist/src/utils/text.d.ts +0 -39
- package/dist/src/utils/text.d.ts.map +0 -1
- package/dist/src/utils/text.js +0 -56
- package/dist/src/utils/text.js.map +0 -1
- package/dist/src/webhook/handler.d.ts +0 -19
- package/dist/src/webhook/handler.d.ts.map +0 -1
- package/dist/src/webhook/handler.js +0 -141
- package/dist/src/webhook/handler.js.map +0 -1
- package/dist-cjs/generated/api.js +0 -194
- package/dist-cjs/package.json +0 -3
- package/dist-cjs/src/api/client.js +0 -107
- package/dist-cjs/src/api/errors.js +0 -74
- package/dist-cjs/src/api/index.js +0 -21
- package/dist-cjs/src/api/telegram-types/LICENSE +0 -21
- package/dist-cjs/src/api/telegram-types/api.d.ts +0 -22
- package/dist-cjs/src/api/telegram-types/checklist.d.ts +0 -72
- package/dist-cjs/src/api/telegram-types/inline.d.ts +0 -692
- package/dist-cjs/src/api/telegram-types/langs.d.ts +0 -193
- package/dist-cjs/src/api/telegram-types/manage.d.ts +0 -1144
- package/dist-cjs/src/api/telegram-types/markup.d.ts +0 -268
- package/dist-cjs/src/api/telegram-types/message.d.ts +0 -1537
- package/dist-cjs/src/api/telegram-types/methods.d.ts +0 -2870
- package/dist-cjs/src/api/telegram-types/mod.d.ts +0 -14
- package/dist-cjs/src/api/telegram-types/passport.d.ts +0 -163
- package/dist-cjs/src/api/telegram-types/payment.d.ts +0 -570
- package/dist-cjs/src/api/telegram-types/rich.d.ts +0 -1010
- package/dist-cjs/src/api/telegram-types/settings.d.ts +0 -120
- package/dist-cjs/src/api/telegram-types/story.d.ts +0 -89
- package/dist-cjs/src/api/telegram-types/update.d.ts +0 -84
- package/dist-cjs/src/api/telegram.js +0 -2
- package/dist-cjs/src/api/transport.js +0 -267
- package/dist-cjs/src/api/types.js +0 -2
- package/dist-cjs/src/branding/terminal.js +0 -338
- package/dist-cjs/src/broadcast/broadcast.js +0 -58
- package/dist-cjs/src/cache/cache.js +0 -45
- package/dist-cjs/src/cli.js +0 -86
- package/dist-cjs/src/context/context.js +0 -305
- package/dist-cjs/src/core/bot.js +0 -510
- package/dist-cjs/src/core/events.js +0 -38
- package/dist-cjs/src/core/webhook-reply.js +0 -42
- package/dist-cjs/src/index.js +0 -47
- package/dist-cjs/src/keyboard/index.js +0 -61
- package/dist-cjs/src/middleware/compose.js +0 -20
- package/dist-cjs/src/observability/logger.js +0 -293
- package/dist-cjs/src/plugins/plugin.js +0 -63
- package/dist-cjs/src/queue/queue.js +0 -219
- package/dist-cjs/src/router/router.js +0 -186
- package/dist-cjs/src/state/conversation.js +0 -139
- package/dist-cjs/src/state/forms.js +0 -47
- package/dist-cjs/src/state/menu.js +0 -133
- package/dist-cjs/src/storage/storage.js +0 -202
- package/dist-cjs/src/telegram-features.js +0 -76
- package/dist-cjs/src/testing.js +0 -45
- package/dist-cjs/src/utils/concurrency.js +0 -57
- package/dist-cjs/src/utils/files.js +0 -58
- package/dist-cjs/src/utils/text.js +0 -63
- package/dist-cjs/src/webhook/handler.js +0 -144
- package/docs/API.id.md +0 -1935
- package/docs/API.md +0 -1969
- package/docs/API.zh-CN.md +0 -1929
- package/docs/GETTING_STARTED.id.md +0 -85
- package/docs/GETTING_STARTED.md +0 -85
- package/docs/GETTING_STARTED.zh-CN.md +0 -85
- package/docs/GITHUB_PACKAGES.id.md +0 -82
- package/docs/GITHUB_PACKAGES.md +0 -82
- package/docs/GITHUB_PACKAGES.zh-CN.md +0 -82
- package/docs/README.md +0 -48
- package/docs/STORAGE.id.md +0 -105
- package/docs/STORAGE.md +0 -105
- package/docs/STORAGE.zh-CN.md +0 -105
- package/examples/README.md +0 -37
- package/examples/files.ts +0 -35
- package/examples/minimal.ts +0 -12
- package/examples/tsconfig.json +0 -9
- package/examples/webhook.ts +0 -42
- package/examples/wizard-registration.ts +0 -42
package/dist/src/core/bot.js
DELETED
|
@@ -1,506 +0,0 @@
|
|
|
1
|
-
import { ApiClient } from "../api/client.js";
|
|
2
|
-
import { FetchTransport } from "../api/transport.js";
|
|
3
|
-
import { Context } from "../context/context.js";
|
|
4
|
-
import { compose } from "../middleware/compose.js";
|
|
5
|
-
import { Router } from "../router/router.js";
|
|
6
|
-
import { EventBus } from "./events.js";
|
|
7
|
-
import { MemoryStorage } from "../storage/storage.js";
|
|
8
|
-
import { PluginManager } from "../plugins/plugin.js";
|
|
9
|
-
import { createLogger, describeIncomingUpdate, Logger, summarizeUpdate } from "../observability/logger.js";
|
|
10
|
-
import { printStatusLine, printTeleBibzBanner, runStartupSequence, startTeleBibzBanner, startTerminalAnimation } from "../branding/terminal.js";
|
|
11
|
-
import { conversationKeyFromContext } from "../state/conversation.js";
|
|
12
|
-
import { runBroadcast } from "../broadcast/broadcast.js";
|
|
13
|
-
import { Limiter } from "../utils/concurrency.js";
|
|
14
|
-
import { runWithWebhookReply, runWithoutWebhookReply } from "./webhook-reply.js";
|
|
15
|
-
import { AsyncLocalStorage } from "node:async_hooks";
|
|
16
|
-
import { writeFile } from "node:fs/promises";
|
|
17
|
-
/** Thrown when a single update exceeds `handlerTimeout`; the handler keeps running in the background. */
|
|
18
|
-
export class UpdateTimeoutError extends Error {
|
|
19
|
-
name = "UpdateTimeoutError";
|
|
20
|
-
updateId;
|
|
21
|
-
constructor(updateId, timeoutMs) {
|
|
22
|
-
super(`Update ${updateId} handler timed out after ${timeoutMs}ms`);
|
|
23
|
-
this.updateId = updateId;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
export class Bot {
|
|
27
|
-
api;
|
|
28
|
-
router;
|
|
29
|
-
events = new EventBus();
|
|
30
|
-
plugins;
|
|
31
|
-
session;
|
|
32
|
-
services;
|
|
33
|
-
token;
|
|
34
|
-
logger;
|
|
35
|
-
middlewares = [];
|
|
36
|
-
pollingOptions;
|
|
37
|
-
statusValue = "created";
|
|
38
|
-
pollingAbort;
|
|
39
|
-
offset = 0;
|
|
40
|
-
me;
|
|
41
|
-
/** Caps how many updates run at once (default: unlimited). */
|
|
42
|
-
updateLimiter;
|
|
43
|
-
/** Per-update timeout in ms; `Infinity` disables. */
|
|
44
|
-
handlerTimeoutMs;
|
|
45
|
-
/** Context class instantiated per update (default `Context`). */
|
|
46
|
-
contextType;
|
|
47
|
-
/** Per-chat processing chains: parallel across chats, ordered within a chat. */
|
|
48
|
-
chatChains = new Map();
|
|
49
|
-
/**
|
|
50
|
-
* Identifies the update chain executing in the current async context so
|
|
51
|
-
* `stop()` called from inside a handler never deadlocks waiting on itself
|
|
52
|
-
* (Telegraf allows `bot.stop()` from within a handler).
|
|
53
|
-
*/
|
|
54
|
-
currentUpdateChain = new AsyncLocalStorage();
|
|
55
|
-
/** Memoized init so a burst of updates triggers exactly one getMe call. */
|
|
56
|
-
initOnce;
|
|
57
|
-
brandingEnabled;
|
|
58
|
-
/** Branding effects run only on an interactive TTY; structured logs stay untouched otherwise. */
|
|
59
|
-
brandingActive;
|
|
60
|
-
activeBanner;
|
|
61
|
-
errorHandler;
|
|
62
|
-
constructor(options) {
|
|
63
|
-
const config = typeof options === "string" ? { token: options } : options;
|
|
64
|
-
if (!config.token || !/^\d+:[\w-]+$/.test(config.token))
|
|
65
|
-
throw new Error("A valid Telegram bot token is required.");
|
|
66
|
-
this.token = config.token;
|
|
67
|
-
this.brandingEnabled = config.branding ?? true;
|
|
68
|
-
this.brandingActive = this.brandingEnabled && process.stdout.isTTY === true;
|
|
69
|
-
this.logger = config.logger instanceof Logger ? config.logger : createLogger(config.logger);
|
|
70
|
-
this.router = new Router(config.router);
|
|
71
|
-
this.session = config.session ?? new MemoryStorage();
|
|
72
|
-
this.services = { ...(config.services ?? {}) };
|
|
73
|
-
const transport = config.transport ?? new FetchTransport({ baseUrl: `${config.apiBaseUrl ?? "https://api.telegram.org"}/bot${config.token}`, ...(config.transportOptions ?? {}) });
|
|
74
|
-
this.api = new ApiClient({
|
|
75
|
-
hooks: {
|
|
76
|
-
onRequest: (context) => { this.logger.trace("api.request", { method: context.method, payload: context.payload }); return this.events.emit("api:request", { method: context.method, payload: context.payload }); },
|
|
77
|
-
onResponse: (context) => { this.logger.debug("api.response", { method: context.method, durationMs: context.durationMs ?? 0, ok: context.response?.ok }); return this.events.emit("api:response", { method: context.method, durationMs: context.durationMs ?? 0, response: context.response }); },
|
|
78
|
-
onError: (context) => { this.logger.error("api.error", { method: context.method, durationMs: context.durationMs ?? 0, error: context.error }); return this.events.emit("api:error", { method: context.method, durationMs: context.durationMs ?? 0, error: context.error }); },
|
|
79
|
-
},
|
|
80
|
-
transport,
|
|
81
|
-
});
|
|
82
|
-
this.plugins = new PluginManager(this);
|
|
83
|
-
this.updateLimiter = new Limiter(config.updates?.concurrency ?? Infinity);
|
|
84
|
-
this.handlerTimeoutMs = config.handlerTimeout ?? 90_000;
|
|
85
|
-
this.contextType = config.contextType ?? Context;
|
|
86
|
-
this.pollingOptions = {
|
|
87
|
-
allowedUpdates: config.polling?.allowedUpdates ?? [],
|
|
88
|
-
limit: config.polling?.limit ?? 100,
|
|
89
|
-
maxRetryDelayMs: config.polling?.maxRetryDelayMs ?? 30_000,
|
|
90
|
-
retryDelayMs: config.polling?.retryDelayMs ?? 500,
|
|
91
|
-
timeout: config.polling?.timeout ?? 30,
|
|
92
|
-
};
|
|
93
|
-
this.startupLog("bot.created", { status: this.statusValue });
|
|
94
|
-
void this.events.emit("bot:created", { bot: this });
|
|
95
|
-
}
|
|
96
|
-
/** Startup info logs are demoted to debug while the branding sequence owns the terminal. */
|
|
97
|
-
startupLog(event, context) {
|
|
98
|
-
if (this.brandingActive)
|
|
99
|
-
this.logger.debug(event, context);
|
|
100
|
-
else
|
|
101
|
-
this.logger.info(event, context);
|
|
102
|
-
}
|
|
103
|
-
get status() { return this.statusValue; }
|
|
104
|
-
get botInfo() { return this.me; }
|
|
105
|
-
use(...middleware) { this.middlewares.push(...middleware); return this; }
|
|
106
|
-
command(name, handler) { this.router.command(name, handler); return this; }
|
|
107
|
-
callback(pattern, handler) { this.router.callback(pattern, handler); return this; }
|
|
108
|
-
/** Telegraf-style alias for `callback()`: registers a handler for callback-query button data. */
|
|
109
|
-
action(pattern, handler) { this.router.callback(pattern, handler); return this; }
|
|
110
|
-
onText(text, handler) { this.router.text(text, handler); return this; }
|
|
111
|
-
onRegex(expression, handler) { this.router.regex(expression, handler); return this; }
|
|
112
|
-
/** Registers a handler for update types: `bot.on("message:photo", handler)` or `bot.on(["message:text", "callback_query:data"], handler)`. */
|
|
113
|
-
on(filter, handler) { this.router.on(filter, handler); return this; }
|
|
114
|
-
/** Registers a handler for exact text or a regular expression, mirroring familiar frameworks. */
|
|
115
|
-
hears(trigger, handler) {
|
|
116
|
-
if (trigger instanceof RegExp)
|
|
117
|
-
this.router.regex(trigger, handler);
|
|
118
|
-
else
|
|
119
|
-
this.router.text(trigger, handler);
|
|
120
|
-
return this;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Sets the error boundary for update handlers. When set, handler failures are
|
|
124
|
-
* passed here instead of rejecting `handleUpdate()` (webhooks answer 200).
|
|
125
|
-
*/
|
|
126
|
-
catch(handler) { this.errorHandler = handler; return this; }
|
|
127
|
-
usePlugin(plugin) { this.plugins.use(plugin); return this; }
|
|
128
|
-
/**
|
|
129
|
-
* Routes subsequent messages to the active Wizard step for the same chat/user.
|
|
130
|
-
* The application starts the wizard once with `wizard.run(ctx, key)`; this
|
|
131
|
-
* middleware keeps routing replies until the wizard is completed or cancelled.
|
|
132
|
-
*/
|
|
133
|
-
useWizard(wizard, options = {}) {
|
|
134
|
-
const cancelCommand = options.cancelCommand ?? "/cancel";
|
|
135
|
-
this.use(async (ctx, next) => {
|
|
136
|
-
const message = ctx.message;
|
|
137
|
-
const key = conversationKeyFromContext(ctx);
|
|
138
|
-
const state = await wizard.manager.getAsync(key);
|
|
139
|
-
if (!message?.text || state?.status !== "active") {
|
|
140
|
-
await next();
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
if (message.text.trim() === cancelCommand) {
|
|
144
|
-
wizard.manager.cancel(key);
|
|
145
|
-
await ctx.reply("Conversation cancelled.");
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
await wizard.run(ctx, key);
|
|
149
|
-
});
|
|
150
|
-
return this;
|
|
151
|
-
}
|
|
152
|
-
async init() {
|
|
153
|
-
if (this.statusValue === "initialized" || this.statusValue === "running")
|
|
154
|
-
return this;
|
|
155
|
-
this.startupLog("bot.initializing", {});
|
|
156
|
-
const standaloneBanner = this.brandingActive && !this.activeBanner;
|
|
157
|
-
const animation = this.brandingActive ? undefined : startTerminalAnimation("Connecting to Telegram and initializing bot");
|
|
158
|
-
if (standaloneBanner)
|
|
159
|
-
printTeleBibzBanner({ subtitle: "Connecting to Telegram..." });
|
|
160
|
-
try {
|
|
161
|
-
this.me = await this.api.methods.getMe();
|
|
162
|
-
this.statusValue = "initialized";
|
|
163
|
-
this.startupLog("bot.initialized", { botId: this.me.id, username: this.me.username });
|
|
164
|
-
await this.events.emit("bot:initialized", { bot: this });
|
|
165
|
-
await this.plugins.setup();
|
|
166
|
-
await this.plugins.start();
|
|
167
|
-
if (standaloneBanner)
|
|
168
|
-
printStatusLine(`✓ Bot initialized as @${this.me.username ?? this.me.id}`);
|
|
169
|
-
else
|
|
170
|
-
animation?.stop("Bot initialized; ready to start");
|
|
171
|
-
return this;
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
if (standaloneBanner)
|
|
175
|
-
printStatusLine(`✗ Bot could not initialize: ${error instanceof Error ? error.message : String(error)}`);
|
|
176
|
-
else
|
|
177
|
-
animation?.stop("Error: bot could not initialize");
|
|
178
|
-
throw error;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
async start(options = {}) { await this.launch({ mode: "polling", ...options }); }
|
|
182
|
-
async launch(options = { mode: "polling" }) {
|
|
183
|
-
if (options.mode !== "polling")
|
|
184
|
-
throw new Error("Use createWebhookHandler() for webhook mode.");
|
|
185
|
-
const runBrandingSequence = this.brandingActive && !this.activeBanner && (this.statusValue === "created" || this.statusValue === "stopped");
|
|
186
|
-
if (runBrandingSequence) {
|
|
187
|
-
await runStartupSequence();
|
|
188
|
-
this.activeBanner = startTeleBibzBanner({ subtitle: "Connecting to Telegram..." });
|
|
189
|
-
}
|
|
190
|
-
try {
|
|
191
|
-
await this.init();
|
|
192
|
-
}
|
|
193
|
-
catch (error) {
|
|
194
|
-
if (this.activeBanner) {
|
|
195
|
-
this.activeBanner.stop(`Connection failed: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
196
|
-
this.activeBanner = undefined;
|
|
197
|
-
}
|
|
198
|
-
throw error;
|
|
199
|
-
}
|
|
200
|
-
if (this.activeBanner) {
|
|
201
|
-
this.activeBanner.stop(`Connected as @${this.me?.username ?? this.me?.id}`);
|
|
202
|
-
this.activeBanner = undefined;
|
|
203
|
-
}
|
|
204
|
-
if (this.statusValue === "running")
|
|
205
|
-
return;
|
|
206
|
-
if (options.dropPendingUpdates) {
|
|
207
|
-
// Same mechanism Telegraf uses: drop everything Telegram is holding for
|
|
208
|
-
// this bot before the first getUpdates call.
|
|
209
|
-
await this.api.call("deleteWebhook", { drop_pending_updates: true });
|
|
210
|
-
}
|
|
211
|
-
this.statusValue = "starting";
|
|
212
|
-
this.startupLog("bot.starting", { mode: options.mode });
|
|
213
|
-
await this.events.emit("bot:starting", { bot: this });
|
|
214
|
-
this.pollingAbort = new AbortController();
|
|
215
|
-
this.statusValue = "running";
|
|
216
|
-
await this.events.emit("bot:started", { bot: this });
|
|
217
|
-
if (this.brandingActive)
|
|
218
|
-
printStatusLine("Listening for updates...");
|
|
219
|
-
await this.poll(options.timeout ?? this.pollingOptions.timeout, options.allowedUpdates ?? this.pollingOptions.allowedUpdates, this.pollingAbort.signal);
|
|
220
|
-
}
|
|
221
|
-
async stop() {
|
|
222
|
-
if (this.statusValue === "stopped" || this.statusValue === "created")
|
|
223
|
-
return;
|
|
224
|
-
this.statusValue = "stopping";
|
|
225
|
-
await this.events.emit("bot:stopping", { bot: this });
|
|
226
|
-
this.pollingAbort?.abort();
|
|
227
|
-
this.pollingAbort = undefined;
|
|
228
|
-
// Graceful shutdown: wait for updates still being processed (bounded by
|
|
229
|
-
// handlerTimeout) so sessions finish writing before plugins are disposed.
|
|
230
|
-
await this.drainInFlightUpdates();
|
|
231
|
-
await this.plugins.stop();
|
|
232
|
-
await this.plugins.dispose();
|
|
233
|
-
this.statusValue = "stopped";
|
|
234
|
-
if (this.brandingActive)
|
|
235
|
-
printStatusLine("Bot stopped.");
|
|
236
|
-
else
|
|
237
|
-
this.logger.info("bot.stopped");
|
|
238
|
-
await this.events.emit("bot:stopped", { bot: this });
|
|
239
|
-
}
|
|
240
|
-
/** Waits (bounded by `handlerTimeout`) for updates that are still processing. */
|
|
241
|
-
async drainInFlightUpdates() {
|
|
242
|
-
// A handler calling stop() must not wait on its own chain (deadlock); it
|
|
243
|
-
// keeps running in the background, exactly like Telegraf.
|
|
244
|
-
const current = this.currentUpdateChain.getStore();
|
|
245
|
-
const inFlight = [...this.chatChains.values()].filter((chain) => chain !== current);
|
|
246
|
-
if (inFlight.length === 0)
|
|
247
|
-
return;
|
|
248
|
-
this.logger.info("bot.draining_updates", { inFlight: inFlight.length });
|
|
249
|
-
await this.withTimeout(Promise.allSettled(inFlight), this.handlerTimeoutMs, -1);
|
|
250
|
-
}
|
|
251
|
-
async restart() { await this.stop(); await this.start(); }
|
|
252
|
-
async health() {
|
|
253
|
-
try {
|
|
254
|
-
const bot = await this.api.methods.getMe();
|
|
255
|
-
return { status: this.statusValue, apiReachable: true, bot, checkedAt: new Date().toISOString() };
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
return { status: this.statusValue, apiReachable: false, checkedAt: new Date().toISOString(), error: error instanceof Error ? error.message : String(error) };
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
async getMe() { const me = await this.api.methods.getMe(); this.me = me; return me; }
|
|
262
|
-
async setCommands(commands, scope, languageCode) { return this.api.call("setMyCommands", { commands, scope, language_code: languageCode }); }
|
|
263
|
-
async deleteCommands(scope, languageCode) { return this.api.call("deleteMyCommands", { scope, language_code: languageCode }); }
|
|
264
|
-
/**
|
|
265
|
-
* Downloads a Telegram file by `file_id`: resolves it with `getFile`, then
|
|
266
|
-
* fetches the raw bytes via the transport's download endpoint. Pass
|
|
267
|
-
* `destination` to also persist the bytes to a local file path. The
|
|
268
|
-
* returned `url` is valid for at least one hour; Telegram caps downloads
|
|
269
|
-
* at 20 MB.
|
|
270
|
-
*/
|
|
271
|
-
async downloadFile(fileId, options = {}) {
|
|
272
|
-
const downloaded = await this.api.downloadFile(fileId, options.signal !== undefined ? { signal: options.signal } : {});
|
|
273
|
-
if (options.destination !== undefined) {
|
|
274
|
-
await writeFile(options.destination, downloaded.bytes);
|
|
275
|
-
return { ...downloaded, savedTo: options.destination };
|
|
276
|
-
}
|
|
277
|
-
return downloaded;
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* Handles a single update. Updates for different chats run in parallel;
|
|
281
|
-
* updates for the same chat are processed strictly in arrival order so
|
|
282
|
-
* sessions, wizards, and conversations never interleave. Rejects for this
|
|
283
|
-
* update's failure (as before) without affecting other updates.
|
|
284
|
-
*
|
|
285
|
-
* `options.webhookReply` installs a Telegraf-style responder: the first
|
|
286
|
-
* outgoing API call during this update is answered through the webhook HTTP
|
|
287
|
-
* response instead of a separate request, and resolves with `true` because
|
|
288
|
-
* Telegram never sends the method result back to a webhook response.
|
|
289
|
-
*/
|
|
290
|
-
async handleUpdate(update, options = {}) {
|
|
291
|
-
const key = this.conversationKey(update);
|
|
292
|
-
const previous = this.chatChains.get(key);
|
|
293
|
-
const execute = options.webhookReply === undefined
|
|
294
|
-
? () => this.processUpdate(update)
|
|
295
|
-
: () => runWithWebhookReply(options.webhookReply, () => this.processUpdate(update));
|
|
296
|
-
// The chain waits for the real completion so same-chat ordering holds
|
|
297
|
-
// even when the caller-facing await below is released by a timeout. The
|
|
298
|
-
// chain is installed as the current AsyncLocalStorage value so a handler
|
|
299
|
-
// calling bot.stop() is excluded from the drain set.
|
|
300
|
-
const run = (previous ?? Promise.resolve()).catch(() => undefined).then(() => this.currentUpdateChain.run(tail, execute));
|
|
301
|
-
const tail = run.then(() => undefined, () => undefined);
|
|
302
|
-
this.chatChains.set(key, tail);
|
|
303
|
-
void tail.then(() => {
|
|
304
|
-
if (this.chatChains.get(key) === tail)
|
|
305
|
-
this.chatChains.delete(key);
|
|
306
|
-
});
|
|
307
|
-
try {
|
|
308
|
-
await this.withTimeout(run, this.handlerTimeoutMs, update.update_id);
|
|
309
|
-
}
|
|
310
|
-
catch (error) {
|
|
311
|
-
if (!(error instanceof UpdateTimeoutError))
|
|
312
|
-
throw error;
|
|
313
|
-
// A timed-out update follows the same error flow as a failed handler;
|
|
314
|
-
// the handler itself keeps running to completion in the background.
|
|
315
|
-
this.logger.error("update.handler_timeout", { updateId: update.update_id, timeoutMs: this.handlerTimeoutMs });
|
|
316
|
-
await this.events.emit("update:error", { update, error });
|
|
317
|
-
await this.events.emit("bot:error", { bot: this, error });
|
|
318
|
-
if (this.errorHandler) {
|
|
319
|
-
await this.errorHandler(error, new Context({ update, api: this.api, session: {}, services: this.services, me: this.me }));
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
throw error;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
/** Rejects with `UpdateTimeoutError` after `timeoutMs` unless `promise` settles first; `timeoutMs <= 0` or a non-finite value disables the guard. */
|
|
326
|
-
async withTimeout(promise, timeoutMs, updateId) {
|
|
327
|
-
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
|
|
328
|
-
return promise;
|
|
329
|
-
let timer;
|
|
330
|
-
const timeout = new Promise((_, reject) => {
|
|
331
|
-
timer = setTimeout(() => reject(new UpdateTimeoutError(updateId, timeoutMs)), timeoutMs);
|
|
332
|
-
});
|
|
333
|
-
try {
|
|
334
|
-
return await Promise.race([promise, timeout]);
|
|
335
|
-
}
|
|
336
|
-
finally {
|
|
337
|
-
if (timer !== undefined)
|
|
338
|
-
clearTimeout(timer);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* Handles a whole batch of updates at once: every chat in the batch is
|
|
343
|
-
* processed immediately (parallel across chats, ordered per chat), so a
|
|
344
|
-
* burst of 1000 messages is not stuck behind one slow handler. Individual
|
|
345
|
-
* handler failures are logged, emitted as `update:error`, and passed to the
|
|
346
|
-
* `catch()` error boundary; they never reject this promise.
|
|
347
|
-
*/
|
|
348
|
-
async handleUpdates(updates) {
|
|
349
|
-
await Promise.all(updates.map(async (update) => {
|
|
350
|
-
try {
|
|
351
|
-
await this.handleUpdate(update);
|
|
352
|
-
}
|
|
353
|
-
catch {
|
|
354
|
-
// Already logged and emitted by processUpdate; the polling loop must
|
|
355
|
-
// keep flowing no matter how many handlers failed.
|
|
356
|
-
}
|
|
357
|
-
}));
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Sends to many chats in parallel — built for broadcasts to 1000+ users.
|
|
361
|
-
* There is no proactive cooldown: every chat is attempted at once (up to
|
|
362
|
-
* `concurrency`). When Telegram answers 429, the send is retried
|
|
363
|
-
* automatically after exactly the `retry_after` delay Telegram ordered, so
|
|
364
|
-
* bursts deliver completely instead of failing.
|
|
365
|
-
*/
|
|
366
|
-
async broadcast(chatIds, send, options) {
|
|
367
|
-
return runBroadcast(chatIds, send, options);
|
|
368
|
-
}
|
|
369
|
-
/** Runs init() once even when many updates arrive concurrently; never claims a webhook reply slot. */
|
|
370
|
-
ensureInitialized() {
|
|
371
|
-
if (this.me)
|
|
372
|
-
return Promise.resolve();
|
|
373
|
-
if (!this.initOnce) {
|
|
374
|
-
this.initOnce = runWithoutWebhookReply(() => this.init()).then(() => { this.initOnce = undefined; }, (error) => {
|
|
375
|
-
this.initOnce = undefined;
|
|
376
|
-
throw error;
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
return this.initOnce;
|
|
380
|
-
}
|
|
381
|
-
async processUpdate(update) {
|
|
382
|
-
await this.updateLimiter.run(() => this.runUpdate(update));
|
|
383
|
-
}
|
|
384
|
-
async runUpdate(update) {
|
|
385
|
-
this.logger.incoming(describeIncomingUpdate(update));
|
|
386
|
-
const message = update.message
|
|
387
|
-
?? update.edited_message
|
|
388
|
-
?? update.channel_post
|
|
389
|
-
?? update.edited_channel_post
|
|
390
|
-
?? update.business_message
|
|
391
|
-
?? update.edited_business_message
|
|
392
|
-
?? update.guest_message
|
|
393
|
-
?? update.callback_query?.message;
|
|
394
|
-
const key = this.conversationKey(update);
|
|
395
|
-
const session = await this.session.get(key) ?? {};
|
|
396
|
-
if (!this.me)
|
|
397
|
-
await this.ensureInitialized();
|
|
398
|
-
if (!this.me)
|
|
399
|
-
return;
|
|
400
|
-
const ctx = new this.contextType({ update, api: this.api, session, services: this.services, me: this.me });
|
|
401
|
-
await this.events.emit("update", { update });
|
|
402
|
-
if (message) {
|
|
403
|
-
await this.events.emit("message", { message });
|
|
404
|
-
if (message.text?.startsWith("/")) {
|
|
405
|
-
const command = message.text.slice(1).split(/[\s@]/, 1)[0] ?? "";
|
|
406
|
-
await this.events.emit("command", { name: command, update });
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
if (update.callback_query)
|
|
410
|
-
await this.events.emit("callback", { data: update.callback_query.data ?? "", update });
|
|
411
|
-
const pipeline = compose([...this.middlewares, async (context) => this.router.handle(context)]);
|
|
412
|
-
try {
|
|
413
|
-
await this.plugins.update(ctx);
|
|
414
|
-
await pipeline(ctx);
|
|
415
|
-
await this.session.set(key, ctx.session);
|
|
416
|
-
}
|
|
417
|
-
catch (error) {
|
|
418
|
-
// A handler failure belongs to this update. It must remain observable and reject
|
|
419
|
-
// direct handleUpdate() callers, but it must not poison the polling lifecycle.
|
|
420
|
-
this.logger.error("update.handler_error", { update: summarizeUpdate(update, this.logger.includeUpdateContent), error });
|
|
421
|
-
await this.events.emit("update:error", { update, error });
|
|
422
|
-
await this.events.emit("bot:error", { bot: this, error });
|
|
423
|
-
if (this.errorHandler) {
|
|
424
|
-
// With an error boundary registered, the failure is considered handled:
|
|
425
|
-
// webhooks answer 200 and polling continues without rethrowing.
|
|
426
|
-
await this.errorHandler(error, ctx);
|
|
427
|
-
return;
|
|
428
|
-
}
|
|
429
|
-
throw error;
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
conversationKey(update) {
|
|
433
|
-
if (update.callback_query) {
|
|
434
|
-
const chat = update.callback_query.message?.chat;
|
|
435
|
-
const userId = update.callback_query.from.id;
|
|
436
|
-
if (chat?.id !== undefined)
|
|
437
|
-
return `${chat.id}:${userId}`;
|
|
438
|
-
return `user:${userId}`;
|
|
439
|
-
}
|
|
440
|
-
if (update.inline_query?.from?.id !== undefined)
|
|
441
|
-
return `user:${update.inline_query.from.id}`;
|
|
442
|
-
if (update.chosen_inline_result?.from?.id !== undefined)
|
|
443
|
-
return `user:${update.chosen_inline_result.from.id}`;
|
|
444
|
-
const message = update.message
|
|
445
|
-
?? update.edited_message
|
|
446
|
-
?? update.channel_post
|
|
447
|
-
?? update.edited_channel_post
|
|
448
|
-
?? update.business_message
|
|
449
|
-
?? update.edited_business_message
|
|
450
|
-
?? update.guest_message;
|
|
451
|
-
if (message?.chat?.id !== undefined)
|
|
452
|
-
return `${message.chat.id}:${message.from?.id ?? "anonymous"}`;
|
|
453
|
-
if (update.chat_member?.chat?.id !== undefined)
|
|
454
|
-
return `${update.chat_member.chat.id}:${update.chat_member.from.id}`;
|
|
455
|
-
if (update.my_chat_member?.chat?.id !== undefined)
|
|
456
|
-
return `${update.my_chat_member.chat.id}:${update.my_chat_member.from.id}`;
|
|
457
|
-
if (update.chat_join_request?.chat?.id !== undefined)
|
|
458
|
-
return `${update.chat_join_request.chat.id}:${update.chat_join_request.from.id}`;
|
|
459
|
-
return `update:${update.update_id}`;
|
|
460
|
-
}
|
|
461
|
-
async waitForRetry(delayMs, signal) {
|
|
462
|
-
if (signal.aborted)
|
|
463
|
-
return false;
|
|
464
|
-
return new Promise((resolve) => {
|
|
465
|
-
const timer = setTimeout(() => {
|
|
466
|
-
signal.removeEventListener("abort", onAbort);
|
|
467
|
-
resolve(true);
|
|
468
|
-
}, delayMs);
|
|
469
|
-
const onAbort = () => {
|
|
470
|
-
clearTimeout(timer);
|
|
471
|
-
signal.removeEventListener("abort", onAbort);
|
|
472
|
-
resolve(false);
|
|
473
|
-
};
|
|
474
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
async poll(timeout, allowedUpdates, signal) {
|
|
478
|
-
let delay = this.pollingOptions.retryDelayMs;
|
|
479
|
-
// Telegram holds a long-poll connection open for `timeout` seconds, so the
|
|
480
|
-
// request timeout must exceed it to avoid aborting a healthy connection.
|
|
481
|
-
const requestTimeoutMs = timeout * 1_000 + 10_000;
|
|
482
|
-
while (!signal.aborted) {
|
|
483
|
-
try {
|
|
484
|
-
const updates = await this.api.request("getUpdates", { offset: this.offset, limit: this.pollingOptions.limit, timeout, allowed_updates: allowedUpdates }, signal, { timeoutMs: requestTimeoutMs });
|
|
485
|
-
delay = this.pollingOptions.retryDelayMs;
|
|
486
|
-
// Confirm the whole batch first, then process it: updates run in
|
|
487
|
-
// parallel across chats (ordered per chat) instead of one by one.
|
|
488
|
-
for (const update of updates) {
|
|
489
|
-
this.offset = Math.max(this.offset, update.update_id + 1);
|
|
490
|
-
}
|
|
491
|
-
await this.handleUpdates(updates);
|
|
492
|
-
}
|
|
493
|
-
catch (error) {
|
|
494
|
-
if (signal.aborted)
|
|
495
|
-
break;
|
|
496
|
-
const attempt = Math.max(1, Math.round(Math.log2(delay / this.pollingOptions.retryDelayMs) + 1));
|
|
497
|
-
this.logger.warn("polling.reconnect", { attempt, delayMs: delay, error });
|
|
498
|
-
await this.events.emit("polling:reconnect", { error, attempt });
|
|
499
|
-
if (!(await this.waitForRetry(delay, signal)))
|
|
500
|
-
break;
|
|
501
|
-
delay = Math.min(this.pollingOptions.maxRetryDelayMs, delay * 2);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
//# sourceMappingURL=bot.js.map
|
package/dist/src/core/bot.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/core/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
export type EventMap = {
|
|
2
|
-
"bot:created": {
|
|
3
|
-
bot: unknown;
|
|
4
|
-
};
|
|
5
|
-
"bot:initialized": {
|
|
6
|
-
bot: unknown;
|
|
7
|
-
};
|
|
8
|
-
"bot:starting": {
|
|
9
|
-
bot: unknown;
|
|
10
|
-
};
|
|
11
|
-
"bot:started": {
|
|
12
|
-
bot: unknown;
|
|
13
|
-
};
|
|
14
|
-
"bot:stopping": {
|
|
15
|
-
bot: unknown;
|
|
16
|
-
};
|
|
17
|
-
"bot:stopped": {
|
|
18
|
-
bot: unknown;
|
|
19
|
-
};
|
|
20
|
-
"bot:error": {
|
|
21
|
-
bot: unknown;
|
|
22
|
-
error: unknown;
|
|
23
|
-
};
|
|
24
|
-
update: {
|
|
25
|
-
update: unknown;
|
|
26
|
-
};
|
|
27
|
-
"update:error": {
|
|
28
|
-
update: unknown;
|
|
29
|
-
error: unknown;
|
|
30
|
-
};
|
|
31
|
-
message: {
|
|
32
|
-
message: unknown;
|
|
33
|
-
};
|
|
34
|
-
command: {
|
|
35
|
-
name: string;
|
|
36
|
-
update: unknown;
|
|
37
|
-
};
|
|
38
|
-
callback: {
|
|
39
|
-
data: string;
|
|
40
|
-
update: unknown;
|
|
41
|
-
};
|
|
42
|
-
"api:request": {
|
|
43
|
-
method: string;
|
|
44
|
-
payload: unknown;
|
|
45
|
-
};
|
|
46
|
-
"api:response": {
|
|
47
|
-
method: string;
|
|
48
|
-
durationMs: number;
|
|
49
|
-
response: unknown;
|
|
50
|
-
};
|
|
51
|
-
"api:error": {
|
|
52
|
-
method: string;
|
|
53
|
-
durationMs: number;
|
|
54
|
-
error: unknown;
|
|
55
|
-
};
|
|
56
|
-
"webhook:request": {
|
|
57
|
-
update: unknown;
|
|
58
|
-
};
|
|
59
|
-
"polling:reconnect": {
|
|
60
|
-
error: unknown;
|
|
61
|
-
attempt: number;
|
|
62
|
-
};
|
|
63
|
-
};
|
|
64
|
-
type Listener<T> = (payload: T) => void | Promise<void>;
|
|
65
|
-
export declare class EventBus<Events extends Record<string, unknown> = EventMap> {
|
|
66
|
-
private readonly listeners;
|
|
67
|
-
on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void;
|
|
68
|
-
once<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void;
|
|
69
|
-
off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void;
|
|
70
|
-
emit<K extends keyof Events>(event: K, payload: Events[K]): Promise<void>;
|
|
71
|
-
removeAllListeners(): void;
|
|
72
|
-
listenerCount<K extends keyof Events>(event: K): number;
|
|
73
|
-
}
|
|
74
|
-
export {};
|
|
75
|
-
//# sourceMappingURL=events.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/core/events.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACrB,aAAa,EAAE;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,iBAAiB,EAAE;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IACpC,cAAc,EAAE;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IACjC,aAAa,EAAE;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,cAAc,EAAE;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IACjC,aAAa,EAAE;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,WAAW,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9C,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,cAAc,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IACpD,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3C,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5C,aAAa,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACpD,cAAc,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1E,WAAW,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IACpE,iBAAiB,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IACvC,mBAAmB,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D,CAAC;AAEF,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAExD,qBAAa,QAAQ,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ;IACrE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgE;IAE1F,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAO/E,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAKjF,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAIpE,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/E,kBAAkB,IAAI,IAAI;IAC1B,aAAa,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;CACxD"}
|
package/dist/src/core/events.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export class EventBus {
|
|
2
|
-
listeners = new Map();
|
|
3
|
-
on(event, listener) {
|
|
4
|
-
const bucket = this.listeners.get(event) ?? new Set();
|
|
5
|
-
bucket.add(listener);
|
|
6
|
-
this.listeners.set(event, bucket);
|
|
7
|
-
return () => this.off(event, listener);
|
|
8
|
-
}
|
|
9
|
-
once(event, listener) {
|
|
10
|
-
const dispose = this.on(event, async (payload) => { dispose(); await listener(payload); });
|
|
11
|
-
return dispose;
|
|
12
|
-
}
|
|
13
|
-
off(event, listener) {
|
|
14
|
-
this.listeners.get(event)?.delete(listener);
|
|
15
|
-
}
|
|
16
|
-
async emit(event, payload) {
|
|
17
|
-
const listeners = [...(this.listeners.get(event) ?? [])];
|
|
18
|
-
const errors = [];
|
|
19
|
-
for (const listener of listeners) {
|
|
20
|
-
try {
|
|
21
|
-
await listener(payload);
|
|
22
|
-
}
|
|
23
|
-
catch (error) {
|
|
24
|
-
errors.push(error);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
if (errors.length === 1)
|
|
28
|
-
throw errors[0];
|
|
29
|
-
if (errors.length > 1)
|
|
30
|
-
throw new AggregateError(errors, `One or more listeners failed for event ${String(event)}`);
|
|
31
|
-
}
|
|
32
|
-
removeAllListeners() { this.listeners.clear(); }
|
|
33
|
-
listenerCount(event) { return this.listeners.get(event)?.size ?? 0; }
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=events.js.map
|