@alfe.ai/openclaw-telegram 0.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/README.md +41 -0
- package/bin/alfe-telegram.mjs +180 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/plugin.cjs +503 -0
- package/dist/plugin.d.cts +58 -0
- package/dist/plugin.d.ts +58 -0
- package/dist/plugin.js +503 -0
- package/dist/telegram-bridge.cjs +300 -0
- package/dist/telegram-bridge.d.cts +72 -0
- package/dist/telegram-bridge.d.ts +72 -0
- package/dist/telegram-bridge.js +289 -0
- package/openclaw.plugin.json +21 -0
- package/package.json +65 -0
- package/python/bridge.py +633 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
let node_crypto = require("node:crypto");
|
|
2
|
+
let node_fs = require("node:fs");
|
|
3
|
+
let node_path = require("node:path");
|
|
4
|
+
let node_url = require("node:url");
|
|
5
|
+
let node_child_process = require("node:child_process");
|
|
6
|
+
//#region src/telegram-bridge.ts
|
|
7
|
+
const MAX_LINE_BYTES = 1024 * 1024;
|
|
8
|
+
const START_TIMEOUT_MS = 2e4;
|
|
9
|
+
const REQUEST_TIMEOUT_MS = 3e4;
|
|
10
|
+
const STOP_TIMEOUT_MS = 2e3;
|
|
11
|
+
var TelegramBridgeUnavailable = class extends Error {
|
|
12
|
+
name = "TelegramBridgeUnavailable";
|
|
13
|
+
constructor(code) {
|
|
14
|
+
super("Telegram local runtime is unavailable");
|
|
15
|
+
this.code = code;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var TelegramBridge = class {
|
|
19
|
+
logger;
|
|
20
|
+
stateDir;
|
|
21
|
+
pythonExecutable;
|
|
22
|
+
bridgeScript;
|
|
23
|
+
spawnBridge;
|
|
24
|
+
startTimeoutMs;
|
|
25
|
+
onEvent;
|
|
26
|
+
onExit;
|
|
27
|
+
child = null;
|
|
28
|
+
buffer = "";
|
|
29
|
+
ready = false;
|
|
30
|
+
stopping = false;
|
|
31
|
+
requests = /* @__PURE__ */ new Map();
|
|
32
|
+
startResolve = null;
|
|
33
|
+
startReject = null;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.logger = options.logger;
|
|
36
|
+
this.stateDir = options.stateDir;
|
|
37
|
+
this.pythonExecutable = options.pythonExecutable ?? resolvePythonExecutable(this.stateDir);
|
|
38
|
+
this.bridgeScript = options.bridgeScript ?? (0, node_url.fileURLToPath)(new URL("../python/bridge.py", require("url").pathToFileURL(__filename).href));
|
|
39
|
+
this.spawnBridge = options.spawnBridge ?? ((command, args) => (0, node_child_process.spawn)(command, args, {
|
|
40
|
+
stdio: [
|
|
41
|
+
"pipe",
|
|
42
|
+
"pipe",
|
|
43
|
+
"pipe"
|
|
44
|
+
],
|
|
45
|
+
env: minimalChildEnvironment()
|
|
46
|
+
}));
|
|
47
|
+
this.startTimeoutMs = options.startTimeoutMs ?? START_TIMEOUT_MS;
|
|
48
|
+
this.onEvent = options.onEvent;
|
|
49
|
+
this.onExit = options.onExit;
|
|
50
|
+
}
|
|
51
|
+
isReady() {
|
|
52
|
+
return this.ready;
|
|
53
|
+
}
|
|
54
|
+
async start() {
|
|
55
|
+
if (this.child) return;
|
|
56
|
+
if (!(0, node_fs.existsSync)(this.pythonExecutable)) throw new TelegramBridgeUnavailable("runtime_missing");
|
|
57
|
+
if (!(0, node_fs.existsSync)(this.bridgeScript)) throw new TelegramBridgeUnavailable("bridge_missing");
|
|
58
|
+
this.stopping = false;
|
|
59
|
+
this.buffer = "";
|
|
60
|
+
const child = this.spawnBridge(this.pythonExecutable, [
|
|
61
|
+
this.bridgeScript,
|
|
62
|
+
"run",
|
|
63
|
+
"--state-dir",
|
|
64
|
+
this.stateDir
|
|
65
|
+
]);
|
|
66
|
+
this.child = child;
|
|
67
|
+
child.stdout.setEncoding("utf8");
|
|
68
|
+
child.stdout.on("data", (chunk) => {
|
|
69
|
+
this.consume(chunk);
|
|
70
|
+
});
|
|
71
|
+
child.stderr.on("data", () => {
|
|
72
|
+
this.logger.debug("Telegram bridge emitted a redacted diagnostic");
|
|
73
|
+
});
|
|
74
|
+
child.on("error", () => {
|
|
75
|
+
this.handleExit("spawn_failed");
|
|
76
|
+
});
|
|
77
|
+
child.on("exit", () => {
|
|
78
|
+
this.handleExit("bridge_exited");
|
|
79
|
+
});
|
|
80
|
+
await new Promise((resolve, reject) => {
|
|
81
|
+
let settled = false;
|
|
82
|
+
const timer = setTimeout(() => {
|
|
83
|
+
if (settled) return;
|
|
84
|
+
settled = true;
|
|
85
|
+
this.startResolve = null;
|
|
86
|
+
this.startReject = null;
|
|
87
|
+
reject(new TelegramBridgeUnavailable("start_timeout"));
|
|
88
|
+
this.stop();
|
|
89
|
+
}, this.startTimeoutMs);
|
|
90
|
+
timer.unref();
|
|
91
|
+
this.startResolve = () => {
|
|
92
|
+
if (settled) return;
|
|
93
|
+
settled = true;
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
this.startResolve = null;
|
|
96
|
+
this.startReject = null;
|
|
97
|
+
resolve();
|
|
98
|
+
};
|
|
99
|
+
this.startReject = (error) => {
|
|
100
|
+
if (settled) return;
|
|
101
|
+
settled = true;
|
|
102
|
+
clearTimeout(timer);
|
|
103
|
+
this.startResolve = null;
|
|
104
|
+
this.startReject = null;
|
|
105
|
+
reject(error);
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async request(method, params = {}) {
|
|
110
|
+
const child = this.child;
|
|
111
|
+
if (!child || !this.ready) throw new TelegramBridgeUnavailable("not_ready");
|
|
112
|
+
const id = (0, node_crypto.randomUUID)();
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
const timer = setTimeout(() => {
|
|
115
|
+
this.requests.delete(id);
|
|
116
|
+
reject(new TelegramBridgeUnavailable("request_timeout"));
|
|
117
|
+
}, REQUEST_TIMEOUT_MS);
|
|
118
|
+
timer.unref();
|
|
119
|
+
this.requests.set(id, {
|
|
120
|
+
resolve: (value) => {
|
|
121
|
+
resolve(value);
|
|
122
|
+
},
|
|
123
|
+
reject,
|
|
124
|
+
timer
|
|
125
|
+
});
|
|
126
|
+
const encoded = JSON.stringify({
|
|
127
|
+
id,
|
|
128
|
+
method,
|
|
129
|
+
params
|
|
130
|
+
});
|
|
131
|
+
child.stdin.write(`${encoded}\n`, (error) => {
|
|
132
|
+
if (!error) return;
|
|
133
|
+
const pending = this.requests.get(id);
|
|
134
|
+
if (!pending) return;
|
|
135
|
+
clearTimeout(pending.timer);
|
|
136
|
+
this.requests.delete(id);
|
|
137
|
+
pending.reject(new TelegramBridgeUnavailable("write_failed"));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async stop() {
|
|
142
|
+
await this.terminate(true, "stopped");
|
|
143
|
+
}
|
|
144
|
+
async terminate(callerRequested, code) {
|
|
145
|
+
const child = this.child;
|
|
146
|
+
if (!child) return;
|
|
147
|
+
this.stopping = callerRequested;
|
|
148
|
+
if (callerRequested && this.ready) await Promise.race([this.request("shutdown").catch(() => void 0), deadline(STOP_TIMEOUT_MS)]);
|
|
149
|
+
child.stdin.end();
|
|
150
|
+
if (child.exitCode === null && child.signalCode === null) child.kill("SIGTERM");
|
|
151
|
+
this.handleExit(code);
|
|
152
|
+
}
|
|
153
|
+
consume(chunk) {
|
|
154
|
+
this.buffer += chunk;
|
|
155
|
+
if (Buffer.byteLength(this.buffer, "utf8") > MAX_LINE_BYTES && !this.buffer.includes("\n")) {
|
|
156
|
+
this.logger.warn("Telegram bridge exceeded the local message boundary");
|
|
157
|
+
this.terminate(false, "message_boundary_exceeded");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
for (;;) {
|
|
161
|
+
const newline = this.buffer.indexOf("\n");
|
|
162
|
+
if (newline < 0) break;
|
|
163
|
+
const line = this.buffer.slice(0, newline);
|
|
164
|
+
this.buffer = this.buffer.slice(newline + 1);
|
|
165
|
+
if (Buffer.byteLength(line, "utf8") > MAX_LINE_BYTES) {
|
|
166
|
+
this.logger.warn("Telegram bridge line exceeded the local message boundary");
|
|
167
|
+
this.terminate(false, "message_boundary_exceeded");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
this.handleLine(line);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
handleLine(line) {
|
|
174
|
+
let decoded;
|
|
175
|
+
try {
|
|
176
|
+
decoded = JSON.parse(line);
|
|
177
|
+
} catch {
|
|
178
|
+
this.logger.warn("Telegram bridge returned invalid local data");
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (!isRecord(decoded) || typeof decoded.type !== "string") return;
|
|
182
|
+
if (decoded.type === "ready") {
|
|
183
|
+
this.ready = true;
|
|
184
|
+
this.startResolve?.();
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (decoded.type === "fatal") {
|
|
188
|
+
const code = safeCode(decoded.code);
|
|
189
|
+
this.startReject?.(new TelegramBridgeUnavailable(code));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (decoded.type === "response" && typeof decoded.id === "string") {
|
|
193
|
+
const pending = this.requests.get(decoded.id);
|
|
194
|
+
if (!pending) return;
|
|
195
|
+
clearTimeout(pending.timer);
|
|
196
|
+
this.requests.delete(decoded.id);
|
|
197
|
+
if (decoded.ok === true) pending.resolve(decoded.result);
|
|
198
|
+
else pending.reject(new TelegramBridgeUnavailable(safeCode(decoded.code)));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (decoded.type === "health") {
|
|
202
|
+
this.logger.warn(`Telegram bridge health warning: ${safeCode(decoded.code)}`);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (decoded.type === "event") {
|
|
206
|
+
const event = parseEvent(decoded.event);
|
|
207
|
+
if (!event) {
|
|
208
|
+
this.logger.warn("Telegram bridge returned an invalid event");
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
this.onEvent(event);
|
|
213
|
+
} catch {
|
|
214
|
+
this.logger.warn("Telegram local event callback failed");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
handleExit(code) {
|
|
219
|
+
if (!this.child && !this.ready) return;
|
|
220
|
+
this.child = null;
|
|
221
|
+
this.ready = false;
|
|
222
|
+
this.buffer = "";
|
|
223
|
+
this.startReject?.(new TelegramBridgeUnavailable(code));
|
|
224
|
+
this.startResolve = null;
|
|
225
|
+
this.startReject = null;
|
|
226
|
+
for (const pending of this.requests.values()) {
|
|
227
|
+
clearTimeout(pending.timer);
|
|
228
|
+
pending.reject(new TelegramBridgeUnavailable(code));
|
|
229
|
+
}
|
|
230
|
+
this.requests.clear();
|
|
231
|
+
if (!this.stopping) this.onExit?.();
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
function resolvePythonExecutable(stateDir) {
|
|
235
|
+
const unix = (0, node_path.join)(stateDir, "runtime", "bin", "python3");
|
|
236
|
+
if ((0, node_fs.existsSync)(unix)) return unix;
|
|
237
|
+
return (0, node_path.join)(stateDir, "runtime", "Scripts", "python.exe");
|
|
238
|
+
}
|
|
239
|
+
function minimalChildEnvironment() {
|
|
240
|
+
const allowed = [
|
|
241
|
+
"HOME",
|
|
242
|
+
"PATH",
|
|
243
|
+
"LANG",
|
|
244
|
+
"LC_ALL",
|
|
245
|
+
"TMPDIR",
|
|
246
|
+
"SYSTEMROOT",
|
|
247
|
+
"WINDIR"
|
|
248
|
+
];
|
|
249
|
+
const result = {};
|
|
250
|
+
for (const key of allowed) {
|
|
251
|
+
const value = process.env[key];
|
|
252
|
+
if (value !== void 0) result[key] = value;
|
|
253
|
+
}
|
|
254
|
+
result.PYTHONUNBUFFERED = "1";
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
function parseEvent(value) {
|
|
258
|
+
if (!isRecord(value)) return null;
|
|
259
|
+
const { deliveryId, messageId, chatId, chatTitle, chatKind, senderId, senderName, senderUsername, text, timestamp } = value;
|
|
260
|
+
if (typeof deliveryId !== "string" || typeof messageId !== "string" || typeof chatId !== "string" || typeof chatTitle !== "string" || typeof chatKind !== "string" || typeof senderId !== "string" || typeof senderName !== "string" || typeof text !== "string" || typeof timestamp !== "string") return null;
|
|
261
|
+
if (chatKind !== "private" && chatKind !== "group" && chatKind !== "channel") return null;
|
|
262
|
+
if (text.length === 0 || text.length > 32e3) return null;
|
|
263
|
+
if (!Number.isFinite(Date.parse(timestamp))) return null;
|
|
264
|
+
return {
|
|
265
|
+
deliveryId,
|
|
266
|
+
messageId,
|
|
267
|
+
chatId,
|
|
268
|
+
chatTitle,
|
|
269
|
+
chatKind,
|
|
270
|
+
senderId,
|
|
271
|
+
senderName,
|
|
272
|
+
...typeof senderUsername === "string" ? { senderUsername } : {},
|
|
273
|
+
text,
|
|
274
|
+
timestamp
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
function safeCode(value) {
|
|
278
|
+
return typeof value === "string" && /^[a-z0-9_]{1,64}$/.test(value) ? value : "bridge_error";
|
|
279
|
+
}
|
|
280
|
+
function isRecord(value) {
|
|
281
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
282
|
+
}
|
|
283
|
+
async function deadline(milliseconds) {
|
|
284
|
+
await new Promise((resolve) => {
|
|
285
|
+
setTimeout(resolve, milliseconds).unref();
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
//#endregion
|
|
289
|
+
Object.defineProperty(exports, "TelegramBridge", {
|
|
290
|
+
enumerable: true,
|
|
291
|
+
get: function() {
|
|
292
|
+
return TelegramBridge;
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
Object.defineProperty(exports, "TelegramBridgeUnavailable", {
|
|
296
|
+
enumerable: true,
|
|
297
|
+
get: function() {
|
|
298
|
+
return TelegramBridgeUnavailable;
|
|
299
|
+
}
|
|
300
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ChildProcessWithoutNullStreams } from "node:child_process";
|
|
2
|
+
|
|
3
|
+
//#region src/telegram-bridge.d.ts
|
|
4
|
+
interface TelegramBridgeLogger {
|
|
5
|
+
info(message: string, ...args: unknown[]): void;
|
|
6
|
+
warn(message: string, ...args: unknown[]): void;
|
|
7
|
+
error(message: string, ...args: unknown[]): void;
|
|
8
|
+
debug(message: string, ...args: unknown[]): void;
|
|
9
|
+
}
|
|
10
|
+
interface TelegramBridgeEvent {
|
|
11
|
+
deliveryId: string;
|
|
12
|
+
messageId: string;
|
|
13
|
+
chatId: string;
|
|
14
|
+
chatTitle: string;
|
|
15
|
+
chatKind: 'private' | 'group' | 'channel';
|
|
16
|
+
senderId: string;
|
|
17
|
+
senderName: string;
|
|
18
|
+
senderUsername?: string;
|
|
19
|
+
text: string;
|
|
20
|
+
timestamp: string;
|
|
21
|
+
}
|
|
22
|
+
interface TelegramBridgeStatus {
|
|
23
|
+
authorized: boolean;
|
|
24
|
+
username?: string;
|
|
25
|
+
displayName?: string;
|
|
26
|
+
subscriptionCount: number;
|
|
27
|
+
pendingCount: number;
|
|
28
|
+
}
|
|
29
|
+
type SpawnBridge = (command: string, args: string[]) => ChildProcessWithoutNullStreams;
|
|
30
|
+
interface TelegramBridgeOptions {
|
|
31
|
+
logger: TelegramBridgeLogger;
|
|
32
|
+
stateDir: string;
|
|
33
|
+
pythonExecutable?: string;
|
|
34
|
+
bridgeScript?: string;
|
|
35
|
+
spawnBridge?: SpawnBridge;
|
|
36
|
+
startTimeoutMs?: number;
|
|
37
|
+
onEvent: (event: TelegramBridgeEvent) => void;
|
|
38
|
+
onExit?: () => void;
|
|
39
|
+
}
|
|
40
|
+
declare class TelegramBridgeUnavailable extends Error {
|
|
41
|
+
readonly code: string;
|
|
42
|
+
readonly name = "TelegramBridgeUnavailable";
|
|
43
|
+
constructor(code: string);
|
|
44
|
+
}
|
|
45
|
+
declare class TelegramBridge {
|
|
46
|
+
private readonly logger;
|
|
47
|
+
private readonly stateDir;
|
|
48
|
+
private readonly pythonExecutable;
|
|
49
|
+
private readonly bridgeScript;
|
|
50
|
+
private readonly spawnBridge;
|
|
51
|
+
private readonly startTimeoutMs;
|
|
52
|
+
private readonly onEvent;
|
|
53
|
+
private readonly onExit?;
|
|
54
|
+
private child;
|
|
55
|
+
private buffer;
|
|
56
|
+
private ready;
|
|
57
|
+
private stopping;
|
|
58
|
+
private requests;
|
|
59
|
+
private startResolve;
|
|
60
|
+
private startReject;
|
|
61
|
+
constructor(options: TelegramBridgeOptions);
|
|
62
|
+
isReady(): boolean;
|
|
63
|
+
start(): Promise<void>;
|
|
64
|
+
request<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>;
|
|
65
|
+
stop(): Promise<void>;
|
|
66
|
+
private terminate;
|
|
67
|
+
private consume;
|
|
68
|
+
private handleLine;
|
|
69
|
+
private handleExit;
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { TelegramBridgeUnavailable as a, TelegramBridgeStatus as i, TelegramBridgeEvent as n, TelegramBridgeLogger as r, TelegramBridge as t };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ChildProcessWithoutNullStreams } from "node:child_process";
|
|
2
|
+
|
|
3
|
+
//#region src/telegram-bridge.d.ts
|
|
4
|
+
interface TelegramBridgeLogger {
|
|
5
|
+
info(message: string, ...args: unknown[]): void;
|
|
6
|
+
warn(message: string, ...args: unknown[]): void;
|
|
7
|
+
error(message: string, ...args: unknown[]): void;
|
|
8
|
+
debug(message: string, ...args: unknown[]): void;
|
|
9
|
+
}
|
|
10
|
+
interface TelegramBridgeEvent {
|
|
11
|
+
deliveryId: string;
|
|
12
|
+
messageId: string;
|
|
13
|
+
chatId: string;
|
|
14
|
+
chatTitle: string;
|
|
15
|
+
chatKind: 'private' | 'group' | 'channel';
|
|
16
|
+
senderId: string;
|
|
17
|
+
senderName: string;
|
|
18
|
+
senderUsername?: string;
|
|
19
|
+
text: string;
|
|
20
|
+
timestamp: string;
|
|
21
|
+
}
|
|
22
|
+
interface TelegramBridgeStatus {
|
|
23
|
+
authorized: boolean;
|
|
24
|
+
username?: string;
|
|
25
|
+
displayName?: string;
|
|
26
|
+
subscriptionCount: number;
|
|
27
|
+
pendingCount: number;
|
|
28
|
+
}
|
|
29
|
+
type SpawnBridge = (command: string, args: string[]) => ChildProcessWithoutNullStreams;
|
|
30
|
+
interface TelegramBridgeOptions {
|
|
31
|
+
logger: TelegramBridgeLogger;
|
|
32
|
+
stateDir: string;
|
|
33
|
+
pythonExecutable?: string;
|
|
34
|
+
bridgeScript?: string;
|
|
35
|
+
spawnBridge?: SpawnBridge;
|
|
36
|
+
startTimeoutMs?: number;
|
|
37
|
+
onEvent: (event: TelegramBridgeEvent) => void;
|
|
38
|
+
onExit?: () => void;
|
|
39
|
+
}
|
|
40
|
+
declare class TelegramBridgeUnavailable extends Error {
|
|
41
|
+
readonly code: string;
|
|
42
|
+
readonly name = "TelegramBridgeUnavailable";
|
|
43
|
+
constructor(code: string);
|
|
44
|
+
}
|
|
45
|
+
declare class TelegramBridge {
|
|
46
|
+
private readonly logger;
|
|
47
|
+
private readonly stateDir;
|
|
48
|
+
private readonly pythonExecutable;
|
|
49
|
+
private readonly bridgeScript;
|
|
50
|
+
private readonly spawnBridge;
|
|
51
|
+
private readonly startTimeoutMs;
|
|
52
|
+
private readonly onEvent;
|
|
53
|
+
private readonly onExit?;
|
|
54
|
+
private child;
|
|
55
|
+
private buffer;
|
|
56
|
+
private ready;
|
|
57
|
+
private stopping;
|
|
58
|
+
private requests;
|
|
59
|
+
private startResolve;
|
|
60
|
+
private startReject;
|
|
61
|
+
constructor(options: TelegramBridgeOptions);
|
|
62
|
+
isReady(): boolean;
|
|
63
|
+
start(): Promise<void>;
|
|
64
|
+
request<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>;
|
|
65
|
+
stop(): Promise<void>;
|
|
66
|
+
private terminate;
|
|
67
|
+
private consume;
|
|
68
|
+
private handleLine;
|
|
69
|
+
private handleExit;
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { TelegramBridgeUnavailable as a, TelegramBridgeStatus as i, TelegramBridgeEvent as n, TelegramBridgeLogger as r, TelegramBridge as t };
|