@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
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
-
import { dirname } from "node:path";
|
|
3
|
-
function expiration(ttlMs) {
|
|
4
|
-
if (ttlMs === undefined)
|
|
5
|
-
return undefined;
|
|
6
|
-
if (!Number.isFinite(ttlMs) || ttlMs < 0)
|
|
7
|
-
throw new RangeError("ttlMs must be a finite non-negative number");
|
|
8
|
-
return Date.now() + ttlMs;
|
|
9
|
-
}
|
|
10
|
-
export class MemoryStorage {
|
|
11
|
-
valuesMap = new Map();
|
|
12
|
-
locks = new Map();
|
|
13
|
-
async get(key) {
|
|
14
|
-
const entry = this.valuesMap.get(key);
|
|
15
|
-
if (!entry)
|
|
16
|
-
return undefined;
|
|
17
|
-
if (entry.expiresAt !== undefined && entry.expiresAt <= Date.now()) {
|
|
18
|
-
this.valuesMap.delete(key);
|
|
19
|
-
return undefined;
|
|
20
|
-
}
|
|
21
|
-
return entry.value;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Reads the raw entry including expiry metadata. Intended for storage adapters
|
|
25
|
-
* (such as `JsonFileStorage`) that need to persist TTL information across restarts.
|
|
26
|
-
*/
|
|
27
|
-
async readEntry(key) {
|
|
28
|
-
const entry = this.valuesMap.get(key);
|
|
29
|
-
if (!entry)
|
|
30
|
-
return undefined;
|
|
31
|
-
if (entry.expiresAt !== undefined && entry.expiresAt <= Date.now()) {
|
|
32
|
-
this.valuesMap.delete(key);
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
return entry.expiresAt === undefined ? { value: entry.value } : { value: entry.value, expiresAt: entry.expiresAt };
|
|
36
|
-
}
|
|
37
|
-
async set(key, value, options = {}) {
|
|
38
|
-
const expiresAt = expiration(options.ttlMs);
|
|
39
|
-
this.valuesMap.set(key, expiresAt === undefined ? { value } : { value, expiresAt });
|
|
40
|
-
}
|
|
41
|
-
async delete(key) { return this.valuesMap.delete(key); }
|
|
42
|
-
async has(key) { return (await this.get(key)) !== undefined; }
|
|
43
|
-
async clear() { this.valuesMap.clear(); }
|
|
44
|
-
async *keys() { for (const key of this.valuesMap.keys())
|
|
45
|
-
if (await this.has(key))
|
|
46
|
-
yield key; }
|
|
47
|
-
async *values() { for await (const [, value] of this.entries())
|
|
48
|
-
yield value; }
|
|
49
|
-
async *entries() { for (const key of this.valuesMap.keys()) {
|
|
50
|
-
const value = await this.get(key);
|
|
51
|
-
if (value !== undefined)
|
|
52
|
-
yield [key, value];
|
|
53
|
-
} }
|
|
54
|
-
async update(key, updater, options = {}) {
|
|
55
|
-
const previous = this.locks.get(key) ?? Promise.resolve();
|
|
56
|
-
let release;
|
|
57
|
-
const currentLock = new Promise((resolve) => { release = resolve; });
|
|
58
|
-
this.locks.set(key, currentLock);
|
|
59
|
-
await previous;
|
|
60
|
-
try {
|
|
61
|
-
const value = await updater(await this.get(key));
|
|
62
|
-
await this.set(key, value, options);
|
|
63
|
-
return value;
|
|
64
|
-
}
|
|
65
|
-
finally {
|
|
66
|
-
release();
|
|
67
|
-
if (this.locks.get(key) === currentLock)
|
|
68
|
-
this.locks.delete(key);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
export class JsonFileStorage {
|
|
73
|
-
filePath;
|
|
74
|
-
memory = new MemoryStorage();
|
|
75
|
-
ready;
|
|
76
|
-
writeChain = Promise.resolve();
|
|
77
|
-
constructor(filePath) {
|
|
78
|
-
this.filePath = filePath;
|
|
79
|
-
this.ready = this.load();
|
|
80
|
-
}
|
|
81
|
-
async load() {
|
|
82
|
-
try {
|
|
83
|
-
const raw = await readFile(this.filePath, "utf8");
|
|
84
|
-
const values = JSON.parse(raw);
|
|
85
|
-
for (const [key, entry] of Object.entries(values))
|
|
86
|
-
await this.memory.set(key, entry.value, entry.expiresAt === undefined ? {} : { ttlMs: Math.max(0, entry.expiresAt - Date.now()) });
|
|
87
|
-
}
|
|
88
|
-
catch (error) {
|
|
89
|
-
if (error.code !== "ENOENT")
|
|
90
|
-
throw error;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
async persist() {
|
|
94
|
-
await this.ready;
|
|
95
|
-
this.writeChain = this.writeChain.then(async () => {
|
|
96
|
-
const output = {};
|
|
97
|
-
for await (const key of this.memory.keys()) {
|
|
98
|
-
const entry = await this.memory.readEntry(key);
|
|
99
|
-
if (entry === undefined)
|
|
100
|
-
continue;
|
|
101
|
-
output[key] = entry.expiresAt === undefined ? { value: entry.value } : { value: entry.value, expiresAt: entry.expiresAt };
|
|
102
|
-
}
|
|
103
|
-
await mkdir(dirname(this.filePath), { recursive: true });
|
|
104
|
-
const temporary = `${this.filePath}.${process.pid}.tmp`;
|
|
105
|
-
await writeFile(temporary, JSON.stringify(output, null, 2), "utf8");
|
|
106
|
-
await rename(temporary, this.filePath);
|
|
107
|
-
});
|
|
108
|
-
await this.writeChain;
|
|
109
|
-
}
|
|
110
|
-
async get(key) { await this.ready; return this.memory.get(key); }
|
|
111
|
-
async set(key, value, options) { await this.ready; await this.memory.set(key, value, options); await this.persist(); }
|
|
112
|
-
async delete(key) { await this.ready; const deleted = await this.memory.delete(key); if (deleted)
|
|
113
|
-
await this.persist(); return deleted; }
|
|
114
|
-
async has(key) { await this.ready; return this.memory.has(key); }
|
|
115
|
-
async clear() { await this.ready; await this.memory.clear(); await this.persist(); }
|
|
116
|
-
async *keys() { await this.ready; yield* this.memory.keys(); }
|
|
117
|
-
async *values() { await this.ready; yield* this.memory.values(); }
|
|
118
|
-
async *entries() { await this.ready; yield* this.memory.entries(); }
|
|
119
|
-
async update(key, updater, options) { await this.ready; const result = await this.memory.update(key, updater, options); await this.persist(); return result; }
|
|
120
|
-
}
|
|
121
|
-
export class RedisStorage {
|
|
122
|
-
client;
|
|
123
|
-
prefix;
|
|
124
|
-
constructor(client, prefix = "telebibz:") {
|
|
125
|
-
this.client = client;
|
|
126
|
-
this.prefix = prefix;
|
|
127
|
-
}
|
|
128
|
-
key(key) { return `${this.prefix}${key}`; }
|
|
129
|
-
unkey(key) { return key.slice(this.prefix.length); }
|
|
130
|
-
async get(key) { const value = await this.client.get(this.key(key)); return value === null ? undefined : JSON.parse(value); }
|
|
131
|
-
async set(key, value, options = {}) { const ttl = options.ttlMs; const redisOptions = ttl === undefined ? {} : { PX: Math.max(1, Math.floor(ttl)) }; await this.client.set(this.key(key), JSON.stringify(value), redisOptions); }
|
|
132
|
-
async delete(key) { return (await this.client.del(this.key(key))) > 0; }
|
|
133
|
-
async has(key) { return (await this.client.exists(this.key(key))) > 0; }
|
|
134
|
-
async clear() { const keys = await this.client.keys(`${this.prefix}*`); if (keys.length)
|
|
135
|
-
await Promise.all(keys.map((key) => this.client.del(key))); }
|
|
136
|
-
async *keys() { for (const key of await this.client.keys(`${this.prefix}*`))
|
|
137
|
-
yield this.unkey(key); }
|
|
138
|
-
async *values() { for await (const [, value] of this.entries())
|
|
139
|
-
yield value; }
|
|
140
|
-
async *entries() { for await (const key of this.keys()) {
|
|
141
|
-
const value = await this.get(key);
|
|
142
|
-
if (value !== undefined)
|
|
143
|
-
yield [key, value];
|
|
144
|
-
} }
|
|
145
|
-
async update(key, updater, options) { const value = await updater(await this.get(key)); await this.set(key, value, options); return value; }
|
|
146
|
-
}
|
|
147
|
-
export class SqlStorage {
|
|
148
|
-
driver;
|
|
149
|
-
constructor(driver) {
|
|
150
|
-
this.driver = driver;
|
|
151
|
-
}
|
|
152
|
-
async get(key) { return this.driver.get(key); }
|
|
153
|
-
async set(key, value, options = {}) { await this.driver.set(key, value, expiration(options.ttlMs)); }
|
|
154
|
-
async delete(key) { return this.driver.delete(key); }
|
|
155
|
-
async has(key) { return this.driver.has(key); }
|
|
156
|
-
async clear() { return this.driver.clear(); }
|
|
157
|
-
async *keys() { for (const [key] of await this.driver.entries())
|
|
158
|
-
yield key; }
|
|
159
|
-
async *values() { for (const [, value] of await this.driver.entries())
|
|
160
|
-
yield value; }
|
|
161
|
-
async *entries() { for (const [key, value, expiresAt] of await this.driver.entries()) {
|
|
162
|
-
if (expiresAt !== undefined && expiresAt <= Date.now()) {
|
|
163
|
-
await this.driver.delete(key);
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
yield [key, value];
|
|
167
|
-
} }
|
|
168
|
-
async update(key, updater, options) { const value = await updater(await this.get(key)); await this.set(key, value, options); return value; }
|
|
169
|
-
}
|
|
170
|
-
export class MongoStorage {
|
|
171
|
-
collection;
|
|
172
|
-
constructor(collection) {
|
|
173
|
-
this.collection = collection;
|
|
174
|
-
}
|
|
175
|
-
async get(key) { const document = await this.collection.findOne({ key }); if (!document || (document.expiresAt !== undefined && document.expiresAt <= Date.now()))
|
|
176
|
-
return undefined; return document.value; }
|
|
177
|
-
async set(key, value, options = {}) {
|
|
178
|
-
const expiresAt = expiration(options.ttlMs);
|
|
179
|
-
const document = expiresAt === undefined ? { key, value } : { key, value, expiresAt };
|
|
180
|
-
await this.collection.replaceOne({ key }, document, { upsert: true });
|
|
181
|
-
}
|
|
182
|
-
async delete(key) { return (await this.collection.deleteOne({ key })).deletedCount === 1; }
|
|
183
|
-
async has(key) { return (await this.get(key)) !== undefined; }
|
|
184
|
-
async clear() { await this.collection.deleteMany({}); }
|
|
185
|
-
async *keys() { for (const document of await this.collection.find({}).toArray())
|
|
186
|
-
if (document.expiresAt === undefined || document.expiresAt > Date.now())
|
|
187
|
-
yield document.key; }
|
|
188
|
-
async *values() { for await (const [, value] of this.entries())
|
|
189
|
-
yield value; }
|
|
190
|
-
async *entries() { for (const document of await this.collection.find({}).toArray())
|
|
191
|
-
if (document.expiresAt === undefined || document.expiresAt > Date.now())
|
|
192
|
-
yield [document.key, document.value]; }
|
|
193
|
-
async update(key, updater, options) { const value = await updater(await this.get(key)); await this.set(key, value, options); return value; }
|
|
194
|
-
}
|
|
195
|
-
//# sourceMappingURL=storage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { ApiClient } from "./api/client.js";
|
|
2
|
-
import type { Message } from "./api/types.js";
|
|
3
|
-
export interface WebAppInitData {
|
|
4
|
-
raw: string;
|
|
5
|
-
hash: string;
|
|
6
|
-
authDate?: number;
|
|
7
|
-
data: Record<string, string>;
|
|
8
|
-
user?: Record<string, unknown>;
|
|
9
|
-
receiver?: Record<string, unknown>;
|
|
10
|
-
chat?: Record<string, unknown>;
|
|
11
|
-
}
|
|
12
|
-
export declare function parseWebAppInitData(initData: string): WebAppInitData;
|
|
13
|
-
export declare function validateWebAppInitData(initData: string, botToken: string, maxAgeSeconds?: number, nowMs?: number): WebAppInitData;
|
|
14
|
-
export interface InvoicePayload {
|
|
15
|
-
[key: string]: unknown;
|
|
16
|
-
}
|
|
17
|
-
export interface PreCheckoutPayload {
|
|
18
|
-
[key: string]: unknown;
|
|
19
|
-
}
|
|
20
|
-
export interface WebAppQueryPayload {
|
|
21
|
-
[key: string]: unknown;
|
|
22
|
-
}
|
|
23
|
-
export declare class PaymentsClient {
|
|
24
|
-
private readonly api;
|
|
25
|
-
constructor(api: ApiClient);
|
|
26
|
-
createInvoiceLink(payload: InvoicePayload): Promise<string>;
|
|
27
|
-
sendInvoice(payload: InvoicePayload): Promise<Message>;
|
|
28
|
-
answerPreCheckoutQuery(payload: PreCheckoutPayload): Promise<true>;
|
|
29
|
-
answerWebAppQuery(payload: WebAppQueryPayload): Promise<Record<string, unknown>>;
|
|
30
|
-
getStarTransactions(payload?: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
31
|
-
refundStarPayment(payload: Record<string, unknown>): Promise<true>;
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=telegram-features.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telegram-features.d.ts","sourceRoot":"","sources":["../../src/telegram-features.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAuBpE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,SAAS,EAAE,KAAK,SAAa,GAAG,cAAc,CAarI;AAED,MAAM,WAAW,cAAc;IAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAC1D,MAAM,WAAW,kBAAkB;IAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAC9D,MAAM,WAAW,kBAAkB;IAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAE9D,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,SAAS;IAC3C,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3D,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IACtD,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAClE,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChF,mBAAmB,CAAC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5F,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CACnE"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
-
export function parseWebAppInitData(initData) {
|
|
3
|
-
const params = new URLSearchParams(initData);
|
|
4
|
-
const hash = params.get("hash");
|
|
5
|
-
if (!hash)
|
|
6
|
-
throw new Error("Web App init data is missing hash");
|
|
7
|
-
const data = {};
|
|
8
|
-
for (const [key, value] of params.entries())
|
|
9
|
-
if (key !== "hash")
|
|
10
|
-
data[key] = value;
|
|
11
|
-
const authDateRaw = data.auth_date;
|
|
12
|
-
const authDate = authDateRaw === undefined ? undefined : Number(authDateRaw);
|
|
13
|
-
if (authDate !== undefined && (!Number.isInteger(authDate) || authDate <= 0))
|
|
14
|
-
throw new Error("Web App init data has an invalid auth_date");
|
|
15
|
-
const parseObject = (key) => {
|
|
16
|
-
const value = data[key];
|
|
17
|
-
if (value === undefined)
|
|
18
|
-
return undefined;
|
|
19
|
-
try {
|
|
20
|
-
return JSON.parse(value);
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
throw new Error(`Web App init data field ${key} is not valid JSON`);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
const result = { raw: initData, hash, data };
|
|
27
|
-
if (authDate !== undefined)
|
|
28
|
-
result.authDate = authDate;
|
|
29
|
-
const user = parseObject("user");
|
|
30
|
-
const receiver = parseObject("receiver");
|
|
31
|
-
const chat = parseObject("chat");
|
|
32
|
-
if (user !== undefined)
|
|
33
|
-
result.user = user;
|
|
34
|
-
if (receiver !== undefined)
|
|
35
|
-
result.receiver = receiver;
|
|
36
|
-
if (chat !== undefined)
|
|
37
|
-
result.chat = chat;
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
|
-
export function validateWebAppInitData(initData, botToken, maxAgeSeconds = 86_400, nowMs = Date.now()) {
|
|
41
|
-
if (!botToken)
|
|
42
|
-
throw new Error("botToken is required");
|
|
43
|
-
if (!Number.isFinite(maxAgeSeconds) || maxAgeSeconds < 0)
|
|
44
|
-
throw new RangeError("maxAgeSeconds must be non-negative");
|
|
45
|
-
const parsed = parseWebAppInitData(initData);
|
|
46
|
-
if (!/^[0-9a-fA-F]{64}$/.test(parsed.hash))
|
|
47
|
-
throw new Error("Web App init data hash must be a 64-character hexadecimal string");
|
|
48
|
-
const checkString = Object.entries(parsed.data).sort(([left], [right]) => left.localeCompare(right)).map(([key, value]) => `${key}=${value}`).join("\n");
|
|
49
|
-
const secret = createHmac("sha256", "WebAppData").update(botToken).digest();
|
|
50
|
-
const expected = createHmac("sha256", secret).update(checkString).digest("hex");
|
|
51
|
-
const actual = Buffer.from(parsed.hash, "hex");
|
|
52
|
-
const expectedBuffer = Buffer.from(expected, "hex");
|
|
53
|
-
if (actual.length !== expectedBuffer.length || !timingSafeEqual(actual, expectedBuffer))
|
|
54
|
-
throw new Error("Web App init data signature is invalid");
|
|
55
|
-
if (parsed.authDate !== undefined && nowMs / 1000 - parsed.authDate > maxAgeSeconds)
|
|
56
|
-
throw new Error("Web App init data has expired");
|
|
57
|
-
return parsed;
|
|
58
|
-
}
|
|
59
|
-
export class PaymentsClient {
|
|
60
|
-
api;
|
|
61
|
-
constructor(api) {
|
|
62
|
-
this.api = api;
|
|
63
|
-
}
|
|
64
|
-
createInvoiceLink(payload) { return this.api.call("createInvoiceLink", payload); }
|
|
65
|
-
sendInvoice(payload) { return this.api.call("sendInvoice", payload); }
|
|
66
|
-
answerPreCheckoutQuery(payload) { return this.api.call("answerPreCheckoutQuery", payload); }
|
|
67
|
-
answerWebAppQuery(payload) { return this.api.call("answerWebAppQuery", payload); }
|
|
68
|
-
getStarTransactions(payload = {}) { return this.api.call("getStarTransactions", payload); }
|
|
69
|
-
refundStarPayment(payload) { return this.api.call("refundStarPayment", payload); }
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=telegram-features.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telegram-features.js","sourceRoot":"","sources":["../../src/telegram-features.ts"],"names":[],"mappings":"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"}
|
package/dist/src/testing.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { Transport, TransportRequest, TransportResponse } from "./api/transport.js";
|
|
2
|
-
import type { TelegramResponse, Update } from "./api/types.js";
|
|
3
|
-
import { Bot } from "./core/bot.js";
|
|
4
|
-
import { Context } from "./context/context.js";
|
|
5
|
-
export declare class MockTransport implements Transport {
|
|
6
|
-
readonly calls: TransportRequest[];
|
|
7
|
-
/** Downloads recorded through `download()` (the `file_path` values, in order). */
|
|
8
|
-
readonly downloads: string[];
|
|
9
|
-
/** Bytes returned by `download()`; defaults to the UTF-8 encoding of the file path. */
|
|
10
|
-
downloadBytes: Uint8Array | undefined;
|
|
11
|
-
private readonly responses;
|
|
12
|
-
respond(method: string, response: TelegramResponse<unknown> | ((payload: unknown) => TelegramResponse<unknown>)): this;
|
|
13
|
-
request<T>(request: TransportRequest): Promise<TransportResponse<T>>;
|
|
14
|
-
fileUrl(filePath: string): string;
|
|
15
|
-
download(filePath: string): Promise<Uint8Array>;
|
|
16
|
-
}
|
|
17
|
-
export declare function createMockUpdate(overrides?: Partial<Update>): Update;
|
|
18
|
-
export declare function createMockCallbackUpdate(overrides?: Partial<Update>): Update;
|
|
19
|
-
export declare function createTestBot(): {
|
|
20
|
-
bot: Bot;
|
|
21
|
-
transport: MockTransport;
|
|
22
|
-
};
|
|
23
|
-
export declare function createMockContext(bot: Bot, update?: Update): Context;
|
|
24
|
-
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,qBAAa,aAAc,YAAW,SAAS;IAC7C,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAM;IACxC,kFAAkF;IAClF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAM;IAClC,uFAAuF;IACvF,aAAa,EAAE,UAAU,GAAG,SAAS,CAAC;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoG;IAC9H,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAChH,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CACtD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,MAAM,CAAM,GAAG,MAAM,CAA+L;AACxQ,wBAAgB,wBAAwB,CAAC,SAAS,GAAE,OAAO,CAAC,MAAM,CAAM,GAAG,MAAM,CAehF;AACD,wBAAgB,aAAa,IAAI;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,aAAa,CAAA;CAAE,CAItE;AACD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAE,MAA2B,GAAG,OAAO,CAA6E"}
|
package/dist/src/testing.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Bot } from "./core/bot.js";
|
|
2
|
-
import { Context } from "./context/context.js";
|
|
3
|
-
export class MockTransport {
|
|
4
|
-
calls = [];
|
|
5
|
-
/** Downloads recorded through `download()` (the `file_path` values, in order). */
|
|
6
|
-
downloads = [];
|
|
7
|
-
/** Bytes returned by `download()`; defaults to the UTF-8 encoding of the file path. */
|
|
8
|
-
downloadBytes;
|
|
9
|
-
responses = new Map();
|
|
10
|
-
respond(method, response) { this.responses.set(method, response); return this; }
|
|
11
|
-
async request(request) { this.calls.push(request); const configured = this.responses.get(request.method); const data = typeof configured === "function" ? configured(request.payload) : configured ?? { ok: true, result: true }; return { status: data.ok ? 200 : (data.error_code ?? 500), headers: new Headers(), data: data }; }
|
|
12
|
-
fileUrl(filePath) { return `mock://files/${filePath}`; }
|
|
13
|
-
async download(filePath) { this.downloads.push(filePath); return this.downloadBytes ?? new TextEncoder().encode(filePath); }
|
|
14
|
-
}
|
|
15
|
-
export function createMockUpdate(overrides = {}) { return { update_id: 1, message: { message_id: 1, date: Date.now(), chat: { id: 1, type: "private" }, from: { id: 2, is_bot: false, first_name: "Test" }, text: "/start" }, ...overrides }; }
|
|
16
|
-
export function createMockCallbackUpdate(overrides = {}) {
|
|
17
|
-
const base = createMockUpdate();
|
|
18
|
-
delete base.message;
|
|
19
|
-
return {
|
|
20
|
-
...base,
|
|
21
|
-
update_id: 2,
|
|
22
|
-
callback_query: {
|
|
23
|
-
id: "callback-1",
|
|
24
|
-
from: { id: 2, is_bot: false, first_name: "Test" },
|
|
25
|
-
message: { message_id: 10, date: Date.now(), chat: { id: 1, type: "private" }, text: "Choose" },
|
|
26
|
-
chat_instance: "chat-instance",
|
|
27
|
-
data: "action",
|
|
28
|
-
},
|
|
29
|
-
...overrides,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
export function createTestBot() {
|
|
33
|
-
const transport = new MockTransport();
|
|
34
|
-
transport.respond("getMe", { ok: true, result: { id: 99, is_bot: true, first_name: "TestBot", username: "test_bot" } });
|
|
35
|
-
return { bot: new Bot({ token: "123456:TEST_TOKEN", transport }), transport };
|
|
36
|
-
}
|
|
37
|
-
export function createMockContext(bot, update = createMockUpdate()) { return new Context({ update, api: bot.api, session: {}, services: {} }); }
|
|
38
|
-
//# sourceMappingURL=testing.js.map
|
package/dist/src/testing.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal concurrency primitives with zero dependencies.
|
|
3
|
-
*
|
|
4
|
-
* These helpers never add proactive delays: they only cap how many async tasks
|
|
5
|
-
* run at the same time. `Infinity` means fully parallel execution.
|
|
6
|
-
*/
|
|
7
|
-
export declare function validateConcurrency(value: number, label?: string): void;
|
|
8
|
-
/** Promise semaphore: runs tasks immediately while a slot is free, queues the rest in FIFO order. */
|
|
9
|
-
export declare class Limiter {
|
|
10
|
-
readonly limit: number;
|
|
11
|
-
private active;
|
|
12
|
-
private readonly waiters;
|
|
13
|
-
constructor(limit: number);
|
|
14
|
-
/** Number of tasks currently running. */
|
|
15
|
-
get activeCount(): number;
|
|
16
|
-
/** Number of tasks waiting for a free slot. */
|
|
17
|
-
get queuedCount(): number;
|
|
18
|
-
run<T>(task: () => Promise<T>): Promise<T>;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Maps items through an async worker with a concurrency cap.
|
|
22
|
-
* Results keep the input order; `Infinity` runs everything in parallel.
|
|
23
|
-
*/
|
|
24
|
-
export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, worker: (item: T, index: number) => Promise<R>): Promise<R[]>;
|
|
25
|
-
//# sourceMappingURL=concurrency.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAgB,GAAG,IAAI,CAG9E;AAED,qGAAqG;AACrG,qBAAa,OAAO;IAIN,QAAQ,CAAC,KAAK,EAAE,MAAM;IAHlC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAE5B,KAAK,EAAE,MAAM;IAIlC,yCAAyC;IACzC,IAAI,WAAW,IAAI,MAAM,CAAwB;IACjD,+CAA+C;IAC/C,IAAI,WAAW,IAAI,MAAM,CAAgC;IAEnD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAUjD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,CAQd"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal concurrency primitives with zero dependencies.
|
|
3
|
-
*
|
|
4
|
-
* These helpers never add proactive delays: they only cap how many async tasks
|
|
5
|
-
* run at the same time. `Infinity` means fully parallel execution.
|
|
6
|
-
*/
|
|
7
|
-
export function validateConcurrency(value, label = "concurrency") {
|
|
8
|
-
if (value === Infinity)
|
|
9
|
-
return;
|
|
10
|
-
if (!Number.isInteger(value) || value < 1)
|
|
11
|
-
throw new RangeError(`${label} must be a positive integer or Infinity`);
|
|
12
|
-
}
|
|
13
|
-
/** Promise semaphore: runs tasks immediately while a slot is free, queues the rest in FIFO order. */
|
|
14
|
-
export class Limiter {
|
|
15
|
-
limit;
|
|
16
|
-
active = 0;
|
|
17
|
-
waiters = [];
|
|
18
|
-
constructor(limit) {
|
|
19
|
-
this.limit = limit;
|
|
20
|
-
validateConcurrency(limit);
|
|
21
|
-
}
|
|
22
|
-
/** Number of tasks currently running. */
|
|
23
|
-
get activeCount() { return this.active; }
|
|
24
|
-
/** Number of tasks waiting for a free slot. */
|
|
25
|
-
get queuedCount() { return this.waiters.length; }
|
|
26
|
-
async run(task) {
|
|
27
|
-
if (this.active >= this.limit)
|
|
28
|
-
await new Promise((resolve) => { this.waiters.push(resolve); });
|
|
29
|
-
this.active += 1;
|
|
30
|
-
try {
|
|
31
|
-
return await task();
|
|
32
|
-
}
|
|
33
|
-
finally {
|
|
34
|
-
this.active -= 1;
|
|
35
|
-
this.waiters.shift()?.();
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Maps items through an async worker with a concurrency cap.
|
|
41
|
-
* Results keep the input order; `Infinity` runs everything in parallel.
|
|
42
|
-
*/
|
|
43
|
-
export async function mapWithConcurrency(items, limit, worker) {
|
|
44
|
-
validateConcurrency(limit);
|
|
45
|
-
const results = new Array(items.length);
|
|
46
|
-
const limiter = new Limiter(limit);
|
|
47
|
-
await Promise.all(items.map((item, index) => limiter.run(async () => {
|
|
48
|
-
results[index] = await worker(item, index);
|
|
49
|
-
})));
|
|
50
|
-
return results;
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=concurrency.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,KAAK,GAAG,aAAa;IACtE,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO;IAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC;AACrH,CAAC;AAED,qGAAqG;AACrG,MAAM,OAAO,OAAO;IAIG;IAHb,MAAM,GAAG,CAAC,CAAC;IACF,OAAO,GAAsB,EAAE,CAAC;IAEjD,YAAqB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAChC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,yCAAyC;IACzC,IAAI,WAAW,KAAa,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,+CAA+C;IAC/C,IAAI,WAAW,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzD,KAAK,CAAC,GAAG,CAAI,IAAsB;QACjC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,KAAa,EACb,MAA8C;IAE9C,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;QAClE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC,CAAC,CAAC;IACL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File-upload validation helpers. Telegram caps uploads at 50 MB for most
|
|
3
|
-
* methods (10 MB for photos) and rejects mismatches between content and
|
|
4
|
-
* declared type; these helpers let applications enforce their own limits
|
|
5
|
-
* before a byte leaves the process.
|
|
6
|
-
*/
|
|
7
|
-
/** Constraints applied to an upload before it is sent. */
|
|
8
|
-
export interface UploadRules {
|
|
9
|
-
/** Maximum size in bytes. */
|
|
10
|
-
maxBytes?: number;
|
|
11
|
-
/** Allowed MIME types; supports wildcards like `image/*`. */
|
|
12
|
-
allowedMimeTypes?: readonly string[];
|
|
13
|
-
/** Allowed file extensions, with or without the leading dot, case-insensitive. */
|
|
14
|
-
allowedExtensions?: readonly string[];
|
|
15
|
-
}
|
|
16
|
-
/** What is known about an upload before it is sent. */
|
|
17
|
-
export interface UploadLike {
|
|
18
|
-
sizeBytes?: number;
|
|
19
|
-
mimeType?: string;
|
|
20
|
-
fileName?: string;
|
|
21
|
-
}
|
|
22
|
-
export type UploadValidationCode = "too_large" | "mime_not_allowed" | "extension_not_allowed";
|
|
23
|
-
export interface UploadValidationIssue {
|
|
24
|
-
code: UploadValidationCode;
|
|
25
|
-
field: "sizeBytes" | "mimeType" | "fileName";
|
|
26
|
-
message: string;
|
|
27
|
-
/** The offending value, when known. */
|
|
28
|
-
actual?: string | number;
|
|
29
|
-
/** The limit that was violated, when applicable. */
|
|
30
|
-
limit?: string | number;
|
|
31
|
-
}
|
|
32
|
-
/** Thrown by {@link assertValidUpload} when an upload violates the rules. */
|
|
33
|
-
export declare class UploadValidationError extends Error {
|
|
34
|
-
readonly name: string;
|
|
35
|
-
readonly issues: readonly UploadValidationIssue[];
|
|
36
|
-
constructor(issues: readonly UploadValidationIssue[]);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Validates an upload against the rules and returns every violation found
|
|
40
|
-
* (an empty array means the upload is acceptable).
|
|
41
|
-
*/
|
|
42
|
-
export declare function validateUpload(upload: UploadLike, rules: UploadRules): UploadValidationIssue[];
|
|
43
|
-
/** Like {@link validateUpload} but throws {@link UploadValidationError} when any rule is violated. */
|
|
44
|
-
export declare function assertValidUpload(upload: UploadLike, rules: UploadRules): void;
|
|
45
|
-
//# sourceMappingURL=files.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/utils/files.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;AAE9F,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,6EAA6E;AAC7E,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,EAAE,MAAM,CAA2B;IACzD,QAAQ,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;gBACtC,MAAM,EAAE,SAAS,qBAAqB,EAAE;CAIrD;AAaD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,qBAAqB,EAAE,CAgB9F;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAG9E"}
|
package/dist/src/utils/files.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File-upload validation helpers. Telegram caps uploads at 50 MB for most
|
|
3
|
-
* methods (10 MB for photos) and rejects mismatches between content and
|
|
4
|
-
* declared type; these helpers let applications enforce their own limits
|
|
5
|
-
* before a byte leaves the process.
|
|
6
|
-
*/
|
|
7
|
-
/** Thrown by {@link assertValidUpload} when an upload violates the rules. */
|
|
8
|
-
export class UploadValidationError extends Error {
|
|
9
|
-
name = "UploadValidationError";
|
|
10
|
-
issues;
|
|
11
|
-
constructor(issues) {
|
|
12
|
-
super(`Upload rejected: ${issues.map((issue) => issue.message).join("; ")}`);
|
|
13
|
-
this.issues = issues;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function normalizeExtension(extension) {
|
|
17
|
-
const value = extension.trim().toLowerCase();
|
|
18
|
-
return value.startsWith(".") ? value.slice(1) : value;
|
|
19
|
-
}
|
|
20
|
-
function mimeMatches(pattern, mimeType) {
|
|
21
|
-
const normalizedPattern = pattern.trim().toLowerCase();
|
|
22
|
-
if (normalizedPattern.endsWith("/*"))
|
|
23
|
-
return mimeType.toLowerCase().startsWith(normalizedPattern.slice(0, -1));
|
|
24
|
-
return mimeType.toLowerCase() === normalizedPattern;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Validates an upload against the rules and returns every violation found
|
|
28
|
-
* (an empty array means the upload is acceptable).
|
|
29
|
-
*/
|
|
30
|
-
export function validateUpload(upload, rules) {
|
|
31
|
-
const issues = [];
|
|
32
|
-
if (rules.maxBytes !== undefined && upload.sizeBytes !== undefined && upload.sizeBytes > rules.maxBytes) {
|
|
33
|
-
issues.push({ code: "too_large", field: "sizeBytes", message: `size ${upload.sizeBytes} bytes exceeds the ${rules.maxBytes} byte limit`, actual: upload.sizeBytes, limit: rules.maxBytes });
|
|
34
|
-
}
|
|
35
|
-
if (rules.allowedMimeTypes !== undefined && rules.allowedMimeTypes.length > 0 && upload.mimeType !== undefined && !rules.allowedMimeTypes.some((pattern) => mimeMatches(pattern, upload.mimeType))) {
|
|
36
|
-
issues.push({ code: "mime_not_allowed", field: "mimeType", message: `MIME type ${upload.mimeType} is not allowed (allowed: ${rules.allowedMimeTypes.join(", ")})`, actual: upload.mimeType, limit: rules.allowedMimeTypes.join(", ") });
|
|
37
|
-
}
|
|
38
|
-
if (rules.allowedExtensions !== undefined && rules.allowedExtensions.length > 0 && upload.fileName !== undefined) {
|
|
39
|
-
const extension = upload.fileName.includes(".") ? upload.fileName.slice(upload.fileName.lastIndexOf(".") + 1) : "";
|
|
40
|
-
const normalized = normalizeExtension(extension);
|
|
41
|
-
if (!normalized || !rules.allowedExtensions.some((allowed) => normalizeExtension(allowed) === normalized)) {
|
|
42
|
-
issues.push({ code: "extension_not_allowed", field: "fileName", message: `extension .${normalized || "?"} is not allowed (allowed: ${rules.allowedExtensions.join(", ")})`, actual: upload.fileName, limit: rules.allowedExtensions.join(", ") });
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return issues;
|
|
46
|
-
}
|
|
47
|
-
/** Like {@link validateUpload} but throws {@link UploadValidationError} when any rule is violated. */
|
|
48
|
-
export function assertValidUpload(upload, rules) {
|
|
49
|
-
const issues = validateUpload(upload, rules);
|
|
50
|
-
if (issues.length > 0)
|
|
51
|
-
throw new UploadValidationError(issues);
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=files.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/utils/files.ts"],"names":[],"mappings":"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"}
|