@xbibzlibrary/telebibz 0.1.2 → 0.1.4
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 +17 -1
- package/CODE_OF_CONDUCT.md +37 -0
- package/CONTRIBUTING.md +54 -0
- package/CONTRIBUTION_RULES.md +41 -0
- package/GOVERNANCE.md +47 -0
- package/NOTICE.md +7 -0
- package/README.id.md +172 -0
- package/README.md +65 -33
- package/README.zh-CN.md +172 -0
- package/RELEASE_AUTOMATION.md +66 -0
- package/RELEASE_POLICY.md +2 -2
- package/SECURITY.md +36 -4
- package/SUPPORT.md +30 -0
- package/assets/readme-preview.html +75 -0
- package/assets/telebibz-readme-preview.png +0 -0
- package/dist/src/api/index.d.ts +1 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +1 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/telegram-types/LICENSE +21 -0
- package/dist/src/api/telegram-types/api.d.ts +22 -0
- package/dist/src/api/telegram-types/checklist.d.ts +72 -0
- package/dist/src/api/telegram-types/inline.d.ts +692 -0
- package/dist/src/api/telegram-types/langs.d.ts +193 -0
- package/dist/src/api/telegram-types/manage.d.ts +1144 -0
- package/dist/src/api/telegram-types/markup.d.ts +268 -0
- package/dist/src/api/telegram-types/message.d.ts +1537 -0
- package/dist/src/api/telegram-types/methods.d.ts +2870 -0
- package/dist/src/api/telegram-types/mod.d.ts +14 -0
- package/dist/src/api/telegram-types/passport.d.ts +163 -0
- package/dist/src/api/telegram-types/payment.d.ts +570 -0
- package/dist/src/api/telegram-types/rich.d.ts +1010 -0
- package/dist/src/api/telegram-types/settings.d.ts +120 -0
- package/dist/src/api/telegram-types/story.d.ts +89 -0
- package/dist/src/api/telegram-types/update.d.ts +84 -0
- package/dist/src/api/telegram.d.ts +7 -0
- package/dist/src/api/telegram.d.ts.map +1 -0
- package/dist/src/api/telegram.js +2 -0
- package/dist/src/api/telegram.js.map +1 -0
- package/dist/src/approval/approval.d.ts +8 -0
- package/dist/src/approval/approval.d.ts.map +1 -1
- package/dist/src/approval/approval.js +9 -0
- package/dist/src/approval/approval.js.map +1 -1
- package/dist/src/cache/cache.d.ts +6 -5
- package/dist/src/cache/cache.d.ts.map +1 -1
- package/dist/src/cache/cache.js +7 -3
- package/dist/src/cache/cache.js.map +1 -1
- package/dist/src/context/context.d.ts.map +1 -1
- package/dist/src/context/context.js +26 -3
- package/dist/src/context/context.js.map +1 -1
- package/dist/src/core/bot.d.ts +6 -4
- package/dist/src/core/bot.d.ts.map +1 -1
- package/dist/src/core/bot.js +48 -7
- package/dist/src/core/bot.js.map +1 -1
- package/dist/src/core/events.d.ts +4 -0
- package/dist/src/core/events.d.ts.map +1 -1
- package/dist/src/core/events.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/queue/queue.d.ts +25 -0
- package/dist/src/queue/queue.d.ts.map +1 -1
- package/dist/src/queue/queue.js +175 -51
- package/dist/src/queue/queue.js.map +1 -1
- package/dist/src/router/router.d.ts +8 -1
- package/dist/src/router/router.d.ts.map +1 -1
- package/dist/src/router/router.js +75 -17
- package/dist/src/router/router.js.map +1 -1
- package/dist/src/state/conversation.d.ts +6 -0
- package/dist/src/state/conversation.d.ts.map +1 -1
- package/dist/src/state/conversation.js +79 -11
- package/dist/src/state/conversation.js.map +1 -1
- package/dist/src/state/menu.d.ts +53 -5
- package/dist/src/state/menu.d.ts.map +1 -1
- package/dist/src/state/menu.js +116 -17
- package/dist/src/state/menu.js.map +1 -1
- package/dist/src/storage/storage.d.ts +115 -12
- package/dist/src/storage/storage.d.ts.map +1 -1
- package/dist/src/storage/storage.js +130 -4
- package/dist/src/storage/storage.js.map +1 -1
- package/dist/src/telegram-features.d.ts +33 -0
- package/dist/src/telegram-features.d.ts.map +1 -0
- package/dist/src/telegram-features.js +69 -0
- package/dist/src/telegram-features.js.map +1 -0
- package/dist/src/testing.d.ts +1 -0
- package/dist/src/testing.d.ts.map +1 -1
- package/dist/src/testing.js +16 -0
- package/dist/src/testing.js.map +1 -1
- package/dist-cjs/src/api/index.js +1 -0
- package/dist-cjs/src/api/telegram-types/LICENSE +21 -0
- package/dist-cjs/src/api/telegram-types/api.d.ts +22 -0
- package/dist-cjs/src/api/telegram-types/checklist.d.ts +72 -0
- package/dist-cjs/src/api/telegram-types/inline.d.ts +692 -0
- package/dist-cjs/src/api/telegram-types/langs.d.ts +193 -0
- package/dist-cjs/src/api/telegram-types/manage.d.ts +1144 -0
- package/dist-cjs/src/api/telegram-types/markup.d.ts +268 -0
- package/dist-cjs/src/api/telegram-types/message.d.ts +1537 -0
- package/dist-cjs/src/api/telegram-types/methods.d.ts +2870 -0
- package/dist-cjs/src/api/telegram-types/mod.d.ts +14 -0
- package/dist-cjs/src/api/telegram-types/passport.d.ts +163 -0
- package/dist-cjs/src/api/telegram-types/payment.d.ts +570 -0
- package/dist-cjs/src/api/telegram-types/rich.d.ts +1010 -0
- package/dist-cjs/src/api/telegram-types/settings.d.ts +120 -0
- package/dist-cjs/src/api/telegram-types/story.d.ts +89 -0
- package/dist-cjs/src/api/telegram-types/update.d.ts +84 -0
- package/dist-cjs/src/api/telegram.js +2 -0
- package/dist-cjs/src/approval/approval.js +11 -1
- package/dist-cjs/src/cache/cache.js +7 -3
- package/dist-cjs/src/context/context.js +26 -3
- package/dist-cjs/src/core/bot.js +48 -7
- package/dist-cjs/src/index.js +1 -0
- package/dist-cjs/src/queue/queue.js +177 -51
- package/dist-cjs/src/router/router.js +75 -17
- package/dist-cjs/src/state/conversation.js +79 -11
- package/dist-cjs/src/state/menu.js +118 -18
- package/dist-cjs/src/storage/storage.js +135 -5
- package/dist-cjs/src/telegram-features.js +74 -0
- package/dist-cjs/src/testing.js +17 -0
- package/docs/API.id.md +1800 -0
- package/docs/API.md +1799 -0
- package/docs/API.zh-CN.md +1794 -0
- package/docs/README.md +36 -17
- package/package.json +20 -3
|
@@ -1,33 +1,136 @@
|
|
|
1
|
+
export interface StorageOptions {
|
|
2
|
+
ttlMs?: number;
|
|
3
|
+
}
|
|
1
4
|
export interface Storage<K, V> {
|
|
2
5
|
get(key: K): Promise<V | undefined>;
|
|
3
|
-
set(key: K, value: V, options?:
|
|
4
|
-
ttlMs?: number;
|
|
5
|
-
}): Promise<void>;
|
|
6
|
+
set(key: K, value: V, options?: StorageOptions): Promise<void>;
|
|
6
7
|
delete(key: K): Promise<boolean>;
|
|
7
8
|
has(key: K): Promise<boolean>;
|
|
8
9
|
clear(): Promise<void>;
|
|
9
10
|
keys(): AsyncIterable<K>;
|
|
10
11
|
values(): AsyncIterable<V>;
|
|
11
12
|
entries(): AsyncIterable<[K, V]>;
|
|
12
|
-
update<T extends V>(key: K, updater: (current: V | undefined) =>
|
|
13
|
-
ttlMs?: number;
|
|
14
|
-
}): Promise<V>;
|
|
13
|
+
update<T extends V>(key: K, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
|
|
15
14
|
}
|
|
16
15
|
export declare class MemoryStorage<K, V> implements Storage<K, V> {
|
|
17
16
|
private readonly valuesMap;
|
|
18
17
|
private readonly locks;
|
|
19
18
|
get(key: K): Promise<V | undefined>;
|
|
20
|
-
set(key: K, value: V, options?:
|
|
21
|
-
ttlMs?: number;
|
|
22
|
-
}): Promise<void>;
|
|
19
|
+
set(key: K, value: V, options?: StorageOptions): Promise<void>;
|
|
23
20
|
delete(key: K): Promise<boolean>;
|
|
24
21
|
has(key: K): Promise<boolean>;
|
|
25
22
|
clear(): Promise<void>;
|
|
26
23
|
keys(): AsyncIterable<K>;
|
|
27
24
|
values(): AsyncIterable<V>;
|
|
28
25
|
entries(): AsyncIterable<[K, V]>;
|
|
29
|
-
update<T extends V>(key: K, updater: (current: V | undefined) => T | Promise<T>, options?:
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
update<T extends V>(key: K, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
|
|
27
|
+
}
|
|
28
|
+
export declare class JsonFileStorage<V> implements Storage<string, V> {
|
|
29
|
+
readonly filePath: string;
|
|
30
|
+
private readonly memory;
|
|
31
|
+
private readonly ready;
|
|
32
|
+
private writeChain;
|
|
33
|
+
constructor(filePath: string);
|
|
34
|
+
private load;
|
|
35
|
+
private persist;
|
|
36
|
+
get(key: string): Promise<V | undefined>;
|
|
37
|
+
set(key: string, value: V, options?: StorageOptions): Promise<void>;
|
|
38
|
+
delete(key: string): Promise<boolean>;
|
|
39
|
+
has(key: string): Promise<boolean>;
|
|
40
|
+
clear(): Promise<void>;
|
|
41
|
+
keys(): AsyncIterable<string>;
|
|
42
|
+
values(): AsyncIterable<V>;
|
|
43
|
+
entries(): AsyncIterable<[string, V]>;
|
|
44
|
+
update<T extends V>(key: string, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
|
|
45
|
+
}
|
|
46
|
+
export interface RedisLikeClient {
|
|
47
|
+
get(key: string): Promise<string | null>;
|
|
48
|
+
set(key: string, value: string, options?: {
|
|
49
|
+
EX?: number;
|
|
50
|
+
PX?: number;
|
|
51
|
+
}): Promise<unknown>;
|
|
52
|
+
del(key: string): Promise<number>;
|
|
53
|
+
exists(key: string): Promise<number>;
|
|
54
|
+
keys(pattern: string): Promise<string[]>;
|
|
55
|
+
}
|
|
56
|
+
export declare class RedisStorage<V> implements Storage<string, V> {
|
|
57
|
+
private readonly client;
|
|
58
|
+
private readonly prefix;
|
|
59
|
+
constructor(client: RedisLikeClient, prefix?: string);
|
|
60
|
+
private key;
|
|
61
|
+
private unkey;
|
|
62
|
+
get(key: string): Promise<V | undefined>;
|
|
63
|
+
set(key: string, value: V, options?: StorageOptions): Promise<void>;
|
|
64
|
+
delete(key: string): Promise<boolean>;
|
|
65
|
+
has(key: string): Promise<boolean>;
|
|
66
|
+
clear(): Promise<void>;
|
|
67
|
+
keys(): AsyncIterable<string>;
|
|
68
|
+
values(): AsyncIterable<V>;
|
|
69
|
+
entries(): AsyncIterable<[string, V]>;
|
|
70
|
+
update<T extends V>(key: string, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
|
|
71
|
+
}
|
|
72
|
+
export interface SqlStorageDriver<V> {
|
|
73
|
+
get(key: string): Promise<V | undefined>;
|
|
74
|
+
set(key: string, value: V, expiresAt?: number): Promise<void>;
|
|
75
|
+
delete(key: string): Promise<boolean>;
|
|
76
|
+
has(key: string): Promise<boolean>;
|
|
77
|
+
clear(): Promise<void>;
|
|
78
|
+
entries(): Promise<Array<[string, V, number | undefined]>>;
|
|
79
|
+
}
|
|
80
|
+
export declare class SqlStorage<V> implements Storage<string, V> {
|
|
81
|
+
private readonly driver;
|
|
82
|
+
constructor(driver: SqlStorageDriver<V>);
|
|
83
|
+
get(key: string): Promise<V | undefined>;
|
|
84
|
+
set(key: string, value: V, options?: StorageOptions): Promise<void>;
|
|
85
|
+
delete(key: string): Promise<boolean>;
|
|
86
|
+
has(key: string): Promise<boolean>;
|
|
87
|
+
clear(): Promise<void>;
|
|
88
|
+
keys(): AsyncIterable<string>;
|
|
89
|
+
values(): AsyncIterable<V>;
|
|
90
|
+
entries(): AsyncIterable<[string, V]>;
|
|
91
|
+
update<T extends V>(key: string, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
|
|
92
|
+
}
|
|
93
|
+
export interface MongoStorageCollection<V> {
|
|
94
|
+
findOne(filter: {
|
|
95
|
+
key: string;
|
|
96
|
+
}): Promise<{
|
|
97
|
+
value: V;
|
|
98
|
+
expiresAt?: number;
|
|
99
|
+
} | null>;
|
|
100
|
+
replaceOne(filter: {
|
|
101
|
+
key: string;
|
|
102
|
+
}, document: {
|
|
103
|
+
key: string;
|
|
104
|
+
value: V;
|
|
105
|
+
expiresAt?: number;
|
|
106
|
+
}, options?: {
|
|
107
|
+
upsert?: boolean;
|
|
108
|
+
}): Promise<unknown>;
|
|
109
|
+
deleteOne(filter: {
|
|
110
|
+
key: string;
|
|
111
|
+
}): Promise<{
|
|
112
|
+
deletedCount?: number;
|
|
113
|
+
}>;
|
|
114
|
+
deleteMany(filter: Record<string, unknown>): Promise<unknown>;
|
|
115
|
+
find(filter?: Record<string, unknown>): {
|
|
116
|
+
toArray(): Promise<Array<{
|
|
117
|
+
key: string;
|
|
118
|
+
value: V;
|
|
119
|
+
expiresAt?: number;
|
|
120
|
+
}>>;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export declare class MongoStorage<V> implements Storage<string, V> {
|
|
124
|
+
private readonly collection;
|
|
125
|
+
constructor(collection: MongoStorageCollection<V>);
|
|
126
|
+
get(key: string): Promise<V | undefined>;
|
|
127
|
+
set(key: string, value: V, options?: StorageOptions): Promise<void>;
|
|
128
|
+
delete(key: string): Promise<boolean>;
|
|
129
|
+
has(key: string): Promise<boolean>;
|
|
130
|
+
clear(): Promise<void>;
|
|
131
|
+
keys(): AsyncIterable<string>;
|
|
132
|
+
values(): AsyncIterable<V>;
|
|
133
|
+
entries(): AsyncIterable<[string, V]>;
|
|
134
|
+
update<T extends V>(key: string, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
|
|
32
135
|
}
|
|
33
136
|
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,12 @@
|
|
|
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
|
+
}
|
|
1
10
|
export class MemoryStorage {
|
|
2
11
|
valuesMap = new Map();
|
|
3
12
|
locks = new Map();
|
|
@@ -12,10 +21,8 @@ export class MemoryStorage {
|
|
|
12
21
|
return entry.value;
|
|
13
22
|
}
|
|
14
23
|
async set(key, value, options = {}) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
entry.expiresAt = Date.now() + options.ttlMs;
|
|
18
|
-
this.valuesMap.set(key, entry);
|
|
24
|
+
const expiresAt = expiration(options.ttlMs);
|
|
25
|
+
this.valuesMap.set(key, expiresAt === undefined ? { value } : { value, expiresAt });
|
|
19
26
|
}
|
|
20
27
|
async delete(key) { return this.valuesMap.delete(key); }
|
|
21
28
|
async has(key) { return (await this.get(key)) !== undefined; }
|
|
@@ -48,4 +55,123 @@ export class MemoryStorage {
|
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
}
|
|
58
|
+
export class JsonFileStorage {
|
|
59
|
+
filePath;
|
|
60
|
+
memory = new MemoryStorage();
|
|
61
|
+
ready;
|
|
62
|
+
writeChain = Promise.resolve();
|
|
63
|
+
constructor(filePath) {
|
|
64
|
+
this.filePath = filePath;
|
|
65
|
+
this.ready = this.load();
|
|
66
|
+
}
|
|
67
|
+
async load() {
|
|
68
|
+
try {
|
|
69
|
+
const raw = await readFile(this.filePath, "utf8");
|
|
70
|
+
const values = JSON.parse(raw);
|
|
71
|
+
for (const [key, entry] of Object.entries(values))
|
|
72
|
+
await this.memory.set(key, entry.value, entry.expiresAt === undefined ? {} : { ttlMs: Math.max(0, entry.expiresAt - Date.now()) });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error.code !== "ENOENT")
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async persist() {
|
|
80
|
+
await this.ready;
|
|
81
|
+
this.writeChain = this.writeChain.then(async () => {
|
|
82
|
+
const output = {};
|
|
83
|
+
for await (const [key, value] of this.memory.entries())
|
|
84
|
+
output[key] = { value };
|
|
85
|
+
await mkdir(dirname(this.filePath), { recursive: true });
|
|
86
|
+
const temporary = `${this.filePath}.${process.pid}.tmp`;
|
|
87
|
+
await writeFile(temporary, JSON.stringify(output, null, 2), "utf8");
|
|
88
|
+
await rename(temporary, this.filePath);
|
|
89
|
+
});
|
|
90
|
+
await this.writeChain;
|
|
91
|
+
}
|
|
92
|
+
async get(key) { await this.ready; return this.memory.get(key); }
|
|
93
|
+
async set(key, value, options) { await this.ready; await this.memory.set(key, value, options); await this.persist(); }
|
|
94
|
+
async delete(key) { await this.ready; const deleted = await this.memory.delete(key); if (deleted)
|
|
95
|
+
await this.persist(); return deleted; }
|
|
96
|
+
async has(key) { await this.ready; return this.memory.has(key); }
|
|
97
|
+
async clear() { await this.ready; await this.memory.clear(); await this.persist(); }
|
|
98
|
+
async *keys() { await this.ready; yield* this.memory.keys(); }
|
|
99
|
+
async *values() { await this.ready; yield* this.memory.values(); }
|
|
100
|
+
async *entries() { await this.ready; yield* this.memory.entries(); }
|
|
101
|
+
async update(key, updater, options) { await this.ready; const result = await this.memory.update(key, updater, options); await this.persist(); return result; }
|
|
102
|
+
}
|
|
103
|
+
export class RedisStorage {
|
|
104
|
+
client;
|
|
105
|
+
prefix;
|
|
106
|
+
constructor(client, prefix = "telebibz:") {
|
|
107
|
+
this.client = client;
|
|
108
|
+
this.prefix = prefix;
|
|
109
|
+
}
|
|
110
|
+
key(key) { return `${this.prefix}${key}`; }
|
|
111
|
+
unkey(key) { return key.slice(this.prefix.length); }
|
|
112
|
+
async get(key) { const value = await this.client.get(this.key(key)); return value === null ? undefined : JSON.parse(value); }
|
|
113
|
+
async set(key, value, options = {}) { const ttl = options.ttlMs; const redisOptions = ttl === undefined ? {} : ttl >= 1000 ? { PX: Math.max(1, Math.floor(ttl)) } : { PX: Math.max(1, Math.floor(ttl)) }; await this.client.set(this.key(key), JSON.stringify(value), redisOptions); }
|
|
114
|
+
async delete(key) { return (await this.client.del(this.key(key))) > 0; }
|
|
115
|
+
async has(key) { return (await this.client.exists(this.key(key))) > 0; }
|
|
116
|
+
async clear() { const keys = await this.client.keys(`${this.prefix}*`); if (keys.length)
|
|
117
|
+
await Promise.all(keys.map((key) => this.client.del(key))); }
|
|
118
|
+
async *keys() { for (const key of await this.client.keys(`${this.prefix}*`))
|
|
119
|
+
yield this.unkey(key); }
|
|
120
|
+
async *values() { for await (const [, value] of this.entries())
|
|
121
|
+
yield value; }
|
|
122
|
+
async *entries() { for await (const key of this.keys()) {
|
|
123
|
+
const value = await this.get(key);
|
|
124
|
+
if (value !== undefined)
|
|
125
|
+
yield [key, value];
|
|
126
|
+
} }
|
|
127
|
+
async update(key, updater, options) { const value = await updater(await this.get(key)); await this.set(key, value, options); return value; }
|
|
128
|
+
}
|
|
129
|
+
export class SqlStorage {
|
|
130
|
+
driver;
|
|
131
|
+
constructor(driver) {
|
|
132
|
+
this.driver = driver;
|
|
133
|
+
}
|
|
134
|
+
async get(key) { return this.driver.get(key); }
|
|
135
|
+
async set(key, value, options = {}) { await this.driver.set(key, value, expiration(options.ttlMs)); }
|
|
136
|
+
async delete(key) { return this.driver.delete(key); }
|
|
137
|
+
async has(key) { return this.driver.has(key); }
|
|
138
|
+
async clear() { return this.driver.clear(); }
|
|
139
|
+
async *keys() { for (const [key] of await this.driver.entries())
|
|
140
|
+
yield key; }
|
|
141
|
+
async *values() { for (const [, value] of await this.driver.entries())
|
|
142
|
+
yield value; }
|
|
143
|
+
async *entries() { for (const [key, value, expiresAt] of await this.driver.entries()) {
|
|
144
|
+
if (expiresAt !== undefined && expiresAt <= Date.now()) {
|
|
145
|
+
await this.driver.delete(key);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
yield [key, value];
|
|
149
|
+
} }
|
|
150
|
+
async update(key, updater, options) { const value = await updater(await this.get(key)); await this.set(key, value, options); return value; }
|
|
151
|
+
}
|
|
152
|
+
export class MongoStorage {
|
|
153
|
+
collection;
|
|
154
|
+
constructor(collection) {
|
|
155
|
+
this.collection = collection;
|
|
156
|
+
}
|
|
157
|
+
async get(key) { const document = await this.collection.findOne({ key }); if (!document || (document.expiresAt !== undefined && document.expiresAt <= Date.now()))
|
|
158
|
+
return undefined; return document.value; }
|
|
159
|
+
async set(key, value, options = {}) {
|
|
160
|
+
const expiresAt = expiration(options.ttlMs);
|
|
161
|
+
const document = expiresAt === undefined ? { key, value } : { key, value, expiresAt };
|
|
162
|
+
await this.collection.replaceOne({ key }, document, { upsert: true });
|
|
163
|
+
}
|
|
164
|
+
async delete(key) { return (await this.collection.deleteOne({ key })).deletedCount === 1; }
|
|
165
|
+
async has(key) { return (await this.get(key)) !== undefined; }
|
|
166
|
+
async clear() { await this.collection.deleteMany({}); }
|
|
167
|
+
async *keys() { for (const document of await this.collection.find({}).toArray())
|
|
168
|
+
if (document.expiresAt === undefined || document.expiresAt > Date.now())
|
|
169
|
+
yield document.key; }
|
|
170
|
+
async *values() { for await (const [, value] of this.entries())
|
|
171
|
+
yield value; }
|
|
172
|
+
async *entries() { for (const document of await this.collection.find({}).toArray())
|
|
173
|
+
if (document.expiresAt === undefined || document.expiresAt > Date.now())
|
|
174
|
+
yield [document.key, document.value]; }
|
|
175
|
+
async update(key, updater, options) { const value = await updater(await this.get(key)); await this.set(key, value, options); return value; }
|
|
176
|
+
}
|
|
51
177
|
//# sourceMappingURL=storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/storage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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,CAYrI;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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
const checkString = Object.entries(parsed.data).sort(([left], [right]) => left.localeCompare(right)).map(([key, value]) => `${key}=${value}`).join("\n");
|
|
47
|
+
const secret = createHmac("sha256", "WebAppData").update(botToken).digest();
|
|
48
|
+
const expected = createHmac("sha256", secret).update(checkString).digest("hex");
|
|
49
|
+
const actual = Buffer.from(parsed.hash, "hex");
|
|
50
|
+
const expectedBuffer = Buffer.from(expected, "hex");
|
|
51
|
+
if (actual.length !== expectedBuffer.length || !timingSafeEqual(actual, expectedBuffer))
|
|
52
|
+
throw new Error("Web App init data signature is invalid");
|
|
53
|
+
if (parsed.authDate !== undefined && nowMs / 1000 - parsed.authDate > maxAgeSeconds)
|
|
54
|
+
throw new Error("Web App init data has expired");
|
|
55
|
+
return parsed;
|
|
56
|
+
}
|
|
57
|
+
export class PaymentsClient {
|
|
58
|
+
api;
|
|
59
|
+
constructor(api) {
|
|
60
|
+
this.api = api;
|
|
61
|
+
}
|
|
62
|
+
createInvoiceLink(payload) { return this.api.call("createInvoiceLink", payload); }
|
|
63
|
+
sendInvoice(payload) { return this.api.call("sendInvoice", payload); }
|
|
64
|
+
answerPreCheckoutQuery(payload) { return this.api.call("answerPreCheckoutQuery", payload); }
|
|
65
|
+
answerWebAppQuery(payload) { return this.api.call("answerWebAppQuery", payload); }
|
|
66
|
+
getStarTransactions(payload = {}) { return this.api.call("getStarTransactions", payload); }
|
|
67
|
+
refundStarPayment(payload) { return this.api.call("refundStarPayment", payload); }
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=telegram-features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-features.js","sourceRoot":"","sources":["../../src/telegram-features.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAc1D,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAChE,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE;QAAE,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnF,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;IACnC,MAAM,QAAQ,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5I,MAAM,WAAW,GAAG,CAAC,GAAW,EAAuC,EAAE;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4B,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,oBAAoB,CAAC,CAAC;QAAC,CAAC;IAC7I,CAAC,CAAC;IACF,MAAM,MAAM,GAAmB,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7D,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACvD,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,QAAgB,EAAE,aAAa,GAAG,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IACnH,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,oCAAoC,CAAC,CAAC;IACrH,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzJ,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACnJ,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACtI,OAAO,MAAM,CAAC;AAChB,CAAC;AAMD,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,GAAc;QAAd,QAAG,GAAH,GAAG,CAAW;IAAG,CAAC;IAC/C,iBAAiB,CAAC,OAAuB,IAAqB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAgB,CAAoB,CAAC,CAAC,CAAC;IAC/I,WAAW,CAAC,OAAuB,IAAsB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,OAAgB,CAAqB,CAAC,CAAC,CAAC;IACrI,sBAAsB,CAAC,OAA2B,IAAmB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAgB,CAAkB,CAAC,CAAC,CAAC;IACzJ,iBAAiB,CAAC,OAA2B,IAAsC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAgB,CAAqC,CAAC,CAAC,CAAC;IACrL,mBAAmB,CAAC,UAAmC,EAAE,IAAsC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,OAAgB,CAAqC,CAAC,CAAC,CAAC;IACnM,iBAAiB,CAAC,OAAgC,IAAmB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAgB,CAAkB,CAAC,CAAC,CAAC;CACrJ"}
|
package/dist/src/testing.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare class MockTransport implements Transport {
|
|
|
9
9
|
request<T>(request: TransportRequest): Promise<TransportResponse<T>>;
|
|
10
10
|
}
|
|
11
11
|
export declare function createMockUpdate(overrides?: Partial<Update>): Update;
|
|
12
|
+
export declare function createMockCallbackUpdate(overrides?: Partial<Update>): Update;
|
|
12
13
|
export declare function createTestBot(): {
|
|
13
14
|
bot: Bot;
|
|
14
15
|
transport: MockTransport;
|
|
@@ -1 +1 @@
|
|
|
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,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;CAC3E;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,MAAM,CAAM,GAAG,MAAM,CAA+L;AACxQ,wBAAgB,aAAa,IAAI;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,aAAa,CAAA;CAAE,CAAmP;AAC1T,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAE,MAA2B,GAAG,OAAO,CAA6E"}
|
|
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,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;CAC3E;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,CAAmP;AAC1T,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,GAAE,MAA2B,GAAG,OAAO,CAA6E"}
|
package/dist/src/testing.js
CHANGED
|
@@ -7,6 +7,22 @@ export class MockTransport {
|
|
|
7
7
|
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 }; }
|
|
8
8
|
}
|
|
9
9
|
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 }; }
|
|
10
|
+
export function createMockCallbackUpdate(overrides = {}) {
|
|
11
|
+
const base = createMockUpdate();
|
|
12
|
+
delete base.message;
|
|
13
|
+
return {
|
|
14
|
+
...base,
|
|
15
|
+
update_id: 2,
|
|
16
|
+
callback_query: {
|
|
17
|
+
id: "callback-1",
|
|
18
|
+
from: { id: 2, is_bot: false, first_name: "Test" },
|
|
19
|
+
message: { message_id: 10, date: Date.now(), chat: { id: 1, type: "private" }, text: "Choose" },
|
|
20
|
+
chat_instance: "chat-instance",
|
|
21
|
+
data: "action",
|
|
22
|
+
},
|
|
23
|
+
...overrides,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
10
26
|
export function createTestBot() { const transport = new MockTransport(); transport.respond("getMe", { ok: true, result: { id: 99, is_bot: true, first_name: "TestBot", username: "test_bot" } }); return { bot: new Bot({ token: "123456:TEST_TOKEN", transport }), transport }; }
|
|
11
27
|
export function createMockContext(bot, update = createMockUpdate()) { return new Context({ update, api: bot.api, session: {}, services: {} }); }
|
|
12
28
|
//# sourceMappingURL=testing.js.map
|
package/dist/src/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,OAAO,aAAa;IACf,KAAK,GAAuB,EAAE,CAAC;IACvB,SAAS,GAAG,IAAI,GAAG,EAAyF,CAAC;IAC9H,OAAO,CAAC,MAAc,EAAE,QAAuF,IAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAC7K,KAAK,CAAC,OAAO,CAAI,OAAyB,IAAmC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,IAA2B,EAAE,CAAC,CAAC,CAAC;CAChZ;AAED,MAAM,UAAU,gBAAgB,CAAC,YAA6B,EAAE,IAAY,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;AACxQ,MAAM,UAAU,aAAa,KAA6C,MAAM,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAC1T,MAAM,UAAU,iBAAiB,CAAC,GAAQ,EAAE,SAAiB,gBAAgB,EAAE,IAAa,OAAO,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021-2024 KnorpelSenf
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ApiError {
|
|
2
|
+
ok: false;
|
|
3
|
+
error_code: number;
|
|
4
|
+
description: string;
|
|
5
|
+
parameters?: ResponseParameters;
|
|
6
|
+
}
|
|
7
|
+
export interface ApiSuccess<T> {
|
|
8
|
+
ok: true;
|
|
9
|
+
result: T;
|
|
10
|
+
}
|
|
11
|
+
/** The response contains an object, which always has a Boolean field 'ok' and may have an optional String field 'description' with a human-readable description of the result. If 'ok' equals True, the request was successful and the result of the query can be found in the 'result' field. In case of an unsuccessful request, 'ok' equals False and the error is explained in the 'description'. An Integer 'error_code' field is also returned, but its contents are subject to change in the future. Some errors may also have an optional field 'parameters' of the type ResponseParameters, which can help to automatically handle the error.
|
|
12
|
+
|
|
13
|
+
- All methods in the Bot API are case-insensitive.
|
|
14
|
+
- All queries must be made using UTF-8. */
|
|
15
|
+
export type ApiResponse<T> = ApiError | ApiSuccess<T>;
|
|
16
|
+
/** Describes why a request was unsuccessful. */
|
|
17
|
+
export interface ResponseParameters {
|
|
18
|
+
/** The group has been migrated to a supergroup with the specified identifier. */
|
|
19
|
+
migrate_to_chat_id?: number;
|
|
20
|
+
/** In case of exceeding flood control, the number of seconds left to wait before the request can be repeated */
|
|
21
|
+
retry_after?: number;
|
|
22
|
+
}
|