@daemux/telegram-adapter 1.0.0

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.
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "@daemux/telegram-adapter",
3
+ "version": "1.0.0",
4
+ "description": "Telegram Bot API channel adapter for daemux",
5
+ "author": "daemux",
6
+ "channel": true,
7
+ "main": "../dist/index.js"
8
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Telegram Bot API Send Methods
3
+ * Media send operations that extend the base TelegramApi.
4
+ * Separated from api.ts to keep function count per file within limits.
5
+ */
6
+ import type { TelegramApi } from './api';
7
+ import type { TelegramMessage } from './types';
8
+ export interface MediaSendOptions {
9
+ caption?: string;
10
+ parseMode?: 'HTML';
11
+ fileName?: string;
12
+ replyToMessageId?: number;
13
+ }
14
+ /** Send a text message. */
15
+ export declare function sendMessage(api: TelegramApi, chatId: number | string, text: string, options?: {
16
+ parseMode?: 'HTML' | 'MarkdownV2';
17
+ replyToMessageId?: number;
18
+ messageThreadId?: number;
19
+ }): Promise<TelegramMessage>;
20
+ /** Send a photo. */
21
+ export declare function sendPhoto(api: TelegramApi, chatId: number | string, photo: Buffer, options?: MediaSendOptions): Promise<TelegramMessage>;
22
+ /** Send a document. */
23
+ export declare function sendDocument(api: TelegramApi, chatId: number | string, document: Buffer, options?: MediaSendOptions): Promise<TelegramMessage>;
24
+ /** Send an audio file. */
25
+ export declare function sendAudio(api: TelegramApi, chatId: number | string, audio: Buffer, options?: MediaSendOptions): Promise<TelegramMessage>;
26
+ /** Send a video. */
27
+ export declare function sendVideo(api: TelegramApi, chatId: number | string, video: Buffer, options?: MediaSendOptions): Promise<TelegramMessage>;
28
+ /** Send a voice message. */
29
+ export declare function sendVoice(api: TelegramApi, chatId: number | string, voice: Buffer, options?: MediaSendOptions): Promise<TelegramMessage>;
30
+ /** Send a video note (round video). */
31
+ export declare function sendVideoNote(api: TelegramApi, chatId: number | string, videoNote: Buffer, options?: {
32
+ replyToMessageId?: number;
33
+ }): Promise<TelegramMessage>;
34
+ /** Send a sticker by file_id. */
35
+ export declare function sendSticker(api: TelegramApi, chatId: number | string, sticker: string, options?: {
36
+ replyToMessageId?: number;
37
+ }): Promise<TelegramMessage>;
38
+ /** Send an animation (GIF). */
39
+ export declare function sendAnimation(api: TelegramApi, chatId: number | string, animation: Buffer, options?: MediaSendOptions): Promise<TelegramMessage>;
40
+ //# sourceMappingURL=api-send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-send.d.ts","sourceRoot":"","sources":["../src/api-send.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA2BD,2BAA2B;AAC3B,wBAAsB,WAAW,CAC/B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,eAAe,CAAC,CAO1B;AAED,oBAAoB;AACpB,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,uBAAuB;AACvB,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,0BAA0B;AAC1B,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,oBAAoB;AACpB,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,4BAA4B;AAC5B,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,uCAAuC;AACvC,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,eAAe,CAAC,CAQ1B;AAED,iCAAiC;AACjC,wBAAsB,WAAW,CAC/B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,eAAe,CAAC,CAI1B;AAED,+BAA+B;AAC/B,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAK1B"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Telegram Bot API Send Methods
3
+ * Media send operations that extend the base TelegramApi.
4
+ * Separated from api.ts to keep function count per file within limits.
5
+ */
6
+ // ---------------------------------------------------------------------------
7
+ // Media file upload helper
8
+ // ---------------------------------------------------------------------------
9
+ function buildMediaFormData(chatId, fieldName, data, options) {
10
+ const formData = new FormData();
11
+ formData.append('chat_id', String(chatId));
12
+ formData.append(fieldName, new Blob([data]), options?.fileName ?? fieldName);
13
+ if (options?.caption)
14
+ formData.append('caption', options.caption);
15
+ if (options?.parseMode)
16
+ formData.append('parse_mode', options.parseMode);
17
+ if (options?.replyToMessageId) {
18
+ formData.append('reply_to_message_id', String(options.replyToMessageId));
19
+ }
20
+ return formData;
21
+ }
22
+ // ---------------------------------------------------------------------------
23
+ // Send functions (operate on a TelegramApi instance)
24
+ // ---------------------------------------------------------------------------
25
+ /** Send a text message. */
26
+ export async function sendMessage(api, chatId, text, options) {
27
+ const params = { chat_id: chatId, text };
28
+ if (options?.parseMode)
29
+ params.parse_mode = options.parseMode;
30
+ if (options?.replyToMessageId)
31
+ params.reply_to_message_id = options.replyToMessageId;
32
+ if (options?.messageThreadId)
33
+ params.message_thread_id = options.messageThreadId;
34
+ return api.callMethod('sendMessage', params);
35
+ }
36
+ /** Send a photo. */
37
+ export async function sendPhoto(api, chatId, photo, options) {
38
+ return api.sendFormData('sendPhoto', buildMediaFormData(chatId, 'photo', photo, options));
39
+ }
40
+ /** Send a document. */
41
+ export async function sendDocument(api, chatId, document, options) {
42
+ return api.sendFormData('sendDocument', buildMediaFormData(chatId, 'document', document, options));
43
+ }
44
+ /** Send an audio file. */
45
+ export async function sendAudio(api, chatId, audio, options) {
46
+ return api.sendFormData('sendAudio', buildMediaFormData(chatId, 'audio', audio, options));
47
+ }
48
+ /** Send a video. */
49
+ export async function sendVideo(api, chatId, video, options) {
50
+ return api.sendFormData('sendVideo', buildMediaFormData(chatId, 'video', video, options));
51
+ }
52
+ /** Send a voice message. */
53
+ export async function sendVoice(api, chatId, voice, options) {
54
+ return api.sendFormData('sendVoice', buildMediaFormData(chatId, 'voice', voice, options));
55
+ }
56
+ /** Send a video note (round video). */
57
+ export async function sendVideoNote(api, chatId, videoNote, options) {
58
+ const formData = new FormData();
59
+ formData.append('chat_id', String(chatId));
60
+ formData.append('video_note', new Blob([videoNote]), 'video_note.mp4');
61
+ if (options?.replyToMessageId) {
62
+ formData.append('reply_to_message_id', String(options.replyToMessageId));
63
+ }
64
+ return api.sendFormData('sendVideoNote', formData);
65
+ }
66
+ /** Send a sticker by file_id. */
67
+ export async function sendSticker(api, chatId, sticker, options) {
68
+ const params = { chat_id: chatId, sticker };
69
+ if (options?.replyToMessageId)
70
+ params.reply_to_message_id = options.replyToMessageId;
71
+ return api.callMethod('sendSticker', params);
72
+ }
73
+ /** Send an animation (GIF). */
74
+ export async function sendAnimation(api, chatId, animation, options) {
75
+ return api.sendFormData('sendAnimation', buildMediaFormData(chatId, 'animation', animation, options));
76
+ }
77
+ //# sourceMappingURL=api-send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-send.js","sourceRoot":"","sources":["../src/api-send.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Telegram Bot API HTTP Transport
3
+ * Core HTTP client with JSON and FormData methods.
4
+ * Send methods are in api-send.ts.
5
+ */
6
+ import type { TelegramBotInfo, TelegramFileInfo, TelegramUpdate } from './types';
7
+ export declare class TelegramApiError extends Error {
8
+ readonly errorCode: number;
9
+ readonly retryAfter?: number;
10
+ constructor(method: string, code: number, description: string, retryAfter?: number);
11
+ }
12
+ export declare class TelegramApi {
13
+ private token;
14
+ private timeoutMs;
15
+ constructor(token: string, timeoutMs?: number);
16
+ /** Build the API endpoint URL for a method. */
17
+ methodUrl(method: string): string;
18
+ /** Build the file download URL. */
19
+ fileDownloadUrl(filePath: string): string;
20
+ /** Get the configured request timeout. */
21
+ getTimeoutMs(): number;
22
+ /** Call a Telegram Bot API method with JSON body. */
23
+ callMethod<T>(method: string, params?: Record<string, unknown>, options?: {
24
+ signal?: AbortSignal;
25
+ timeoutMs?: number;
26
+ }): Promise<T>;
27
+ /** Call a Telegram Bot API method with FormData body (for file uploads). */
28
+ sendFormData<T>(method: string, formData: FormData): Promise<T>;
29
+ /** Verify the bot token and get bot info. */
30
+ getMe(): Promise<TelegramBotInfo>;
31
+ /** Fetch new updates via long polling. */
32
+ getUpdates(offset?: number, timeout?: number, signal?: AbortSignal): Promise<TelegramUpdate[]>;
33
+ /** Get file info (needed before downloading). */
34
+ getFile(fileId: string): Promise<TelegramFileInfo>;
35
+ /** Download a file by its file_path. */
36
+ downloadFile(filePath: string, maxBytes?: number): Promise<Buffer>;
37
+ private parseResponse;
38
+ }
39
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAUjB,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAMnF;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;gBAEd,KAAK,EAAE,MAAM,EAAE,SAAS,SAAqB;IAKzD,+CAA+C;IAC/C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIjC,mCAAmC;IACnC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAOzC,0CAA0C;IAC1C,YAAY,IAAI,MAAM;IAItB,qDAAqD;IAC/C,UAAU,CAAC,CAAC,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACrD,OAAO,CAAC,CAAC,CAAC;IAiBb,4EAA4E;IACtE,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IAUrE,6CAA6C;IACvC,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAIvC,0CAA0C;IACpC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,SAAK,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAahG,iDAAiD;IAC3C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIxD,wCAAwC;IAClC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YA8B1D,aAAa;CAa5B"}
package/dist/api.js ADDED
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Telegram Bot API HTTP Transport
3
+ * Core HTTP client with JSON and FormData methods.
4
+ * Send methods are in api-send.ts.
5
+ */
6
+ const BASE_URL = 'https://api.telegram.org';
7
+ const DEFAULT_TIMEOUT_MS = 30_000;
8
+ const FILE_DOWNLOAD_TIMEOUT_MS = 60_000;
9
+ // ---------------------------------------------------------------------------
10
+ // Error Types
11
+ // ---------------------------------------------------------------------------
12
+ export class TelegramApiError extends Error {
13
+ errorCode;
14
+ retryAfter;
15
+ constructor(method, code, description, retryAfter) {
16
+ super(`Telegram API error [${method}]: ${code} - ${description}`);
17
+ this.name = 'TelegramApiError';
18
+ this.errorCode = code;
19
+ this.retryAfter = retryAfter;
20
+ }
21
+ }
22
+ // ---------------------------------------------------------------------------
23
+ // API Client - Core Transport
24
+ // ---------------------------------------------------------------------------
25
+ export class TelegramApi {
26
+ token;
27
+ timeoutMs;
28
+ constructor(token, timeoutMs = DEFAULT_TIMEOUT_MS) {
29
+ this.token = token;
30
+ this.timeoutMs = timeoutMs;
31
+ }
32
+ /** Build the API endpoint URL for a method. */
33
+ methodUrl(method) {
34
+ return `${BASE_URL}/bot${this.token}/${method}`;
35
+ }
36
+ /** Build the file download URL. */
37
+ fileDownloadUrl(filePath) {
38
+ if (filePath.includes('..')) {
39
+ throw new Error('Invalid file path');
40
+ }
41
+ return `${BASE_URL}/file/bot${this.token}/${filePath}`;
42
+ }
43
+ /** Get the configured request timeout. */
44
+ getTimeoutMs() {
45
+ return this.timeoutMs;
46
+ }
47
+ /** Call a Telegram Bot API method with JSON body. */
48
+ async callMethod(method, params, options) {
49
+ const effectiveTimeout = options?.timeoutMs ?? this.timeoutMs;
50
+ const timeoutSignal = AbortSignal.timeout(effectiveTimeout);
51
+ const signal = options?.signal
52
+ ? AbortSignal.any([timeoutSignal, options.signal])
53
+ : timeoutSignal;
54
+ const response = await fetch(this.methodUrl(method), {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: params ? JSON.stringify(params) : undefined,
58
+ signal,
59
+ });
60
+ return this.parseResponse(response, method);
61
+ }
62
+ /** Call a Telegram Bot API method with FormData body (for file uploads). */
63
+ async sendFormData(method, formData) {
64
+ const response = await fetch(this.methodUrl(method), {
65
+ method: 'POST',
66
+ body: formData,
67
+ signal: AbortSignal.timeout(this.timeoutMs),
68
+ });
69
+ return this.parseResponse(response, method);
70
+ }
71
+ /** Verify the bot token and get bot info. */
72
+ async getMe() {
73
+ return this.callMethod('getMe');
74
+ }
75
+ /** Fetch new updates via long polling. */
76
+ async getUpdates(offset, timeout = 30, signal) {
77
+ // HTTP timeout must exceed Telegram's long-polling timeout to avoid
78
+ // aborting the request before Telegram responds with "no updates".
79
+ // Buffer of 10s accounts for network latency and server processing.
80
+ const httpTimeoutMs = (timeout + 10) * 1000;
81
+ return this.callMethod('getUpdates', {
82
+ offset,
83
+ timeout,
84
+ allowed_updates: ['message', 'edited_message'],
85
+ }, { signal, timeoutMs: httpTimeoutMs });
86
+ }
87
+ /** Get file info (needed before downloading). */
88
+ async getFile(fileId) {
89
+ return this.callMethod('getFile', { file_id: fileId });
90
+ }
91
+ /** Download a file by its file_path. */
92
+ async downloadFile(filePath, maxBytes) {
93
+ const response = await fetch(this.fileDownloadUrl(filePath), {
94
+ signal: AbortSignal.timeout(FILE_DOWNLOAD_TIMEOUT_MS),
95
+ });
96
+ if (!response.ok) {
97
+ throw new Error(`File download failed: HTTP ${response.status} ${response.statusText}`);
98
+ }
99
+ // Fast pre-check using Content-Length header before reading body.
100
+ if (maxBytes) {
101
+ const contentLength = response.headers.get('content-length');
102
+ if (contentLength && parseInt(contentLength, 10) > maxBytes) {
103
+ throw new Error(`File exceeds size limit: ${contentLength} > ${maxBytes} bytes`);
104
+ }
105
+ }
106
+ const arrayBuffer = await response.arrayBuffer();
107
+ if (maxBytes && arrayBuffer.byteLength > maxBytes) {
108
+ throw new Error(`File exceeds size limit: ${arrayBuffer.byteLength} > ${maxBytes} bytes`);
109
+ }
110
+ return Buffer.from(arrayBuffer);
111
+ }
112
+ // -----------------------------------------------------------------------
113
+ // Internal
114
+ // -----------------------------------------------------------------------
115
+ async parseResponse(response, method) {
116
+ const data = (await response.json());
117
+ if (!data.ok) {
118
+ throw new TelegramApiError(method, data.error_code ?? response.status, data.description ?? 'Unknown error', data.parameters?.retry_after);
119
+ }
120
+ return data.result;
121
+ }
122
+ }
123
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Message Conversion Utilities
3
+ * Converts Telegram messages to RichChannelMessage format.
4
+ */
5
+ import type { TelegramMessage, TelegramChannelConfig } from './types';
6
+ import type { RichChannelMessage } from '@daemux/plugin-sdk';
7
+ export declare function isUserAllowed(msg: TelegramMessage, config: TelegramChannelConfig | null): boolean;
8
+ export declare function convertTelegramMessage(msg: TelegramMessage): RichChannelMessage;
9
+ //# sourceMappingURL=channel-convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-convert.d.ts","sourceRoot":"","sources":["../src/channel-convert.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAOhF,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO,CAQjG;AAMD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,GAAG,kBAAkB,CA0B/E"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Message Conversion Utilities
3
+ * Converts Telegram messages to RichChannelMessage format.
4
+ */
5
+ import { resolveMessageType, resolveAttachment } from './message-resolver';
6
+ // ---------------------------------------------------------------------------
7
+ // User Allowlist Check
8
+ // ---------------------------------------------------------------------------
9
+ export function isUserAllowed(msg, config) {
10
+ const allowedIds = config?.allowedUserIds;
11
+ if (!allowedIds || allowedIds.length === 0)
12
+ return true;
13
+ const senderId = msg.from?.id;
14
+ if (!senderId)
15
+ return false;
16
+ return allowedIds.includes(senderId);
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Telegram Message -> RichChannelMessage
20
+ // ---------------------------------------------------------------------------
21
+ export function convertTelegramMessage(msg) {
22
+ const messageType = resolveMessageType(msg);
23
+ const attachment = resolveAttachment(msg);
24
+ return {
25
+ id: String(msg.message_id),
26
+ channelId: String(msg.chat.id),
27
+ channelType: 'telegram',
28
+ messageType,
29
+ senderId: String(msg.from?.id ?? 0),
30
+ senderName: buildSenderName(msg),
31
+ senderUsername: msg.from?.username,
32
+ content: msg.text ?? msg.caption ?? '',
33
+ attachments: attachment ? [buildChannelAttachment(attachment)] : [],
34
+ replyToId: msg.reply_to_message ? String(msg.reply_to_message.message_id) : undefined,
35
+ threadId: msg.message_thread_id ? String(msg.message_thread_id) : undefined,
36
+ timestamp: msg.date * 1000,
37
+ isGroup: msg.chat.type === 'group' || msg.chat.type === 'supergroup',
38
+ chatTitle: msg.chat.title,
39
+ metadata: {
40
+ chatType: msg.chat.type,
41
+ telegramMessageId: msg.message_id,
42
+ telegramChatId: msg.chat.id,
43
+ isForwarded: msg.forward_date !== undefined,
44
+ },
45
+ };
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Internal Helpers
49
+ // ---------------------------------------------------------------------------
50
+ function buildSenderName(msg) {
51
+ if (!msg.from)
52
+ return undefined;
53
+ return [msg.from.first_name, msg.from.last_name].filter(Boolean).join(' ');
54
+ }
55
+ function buildChannelAttachment(resolved) {
56
+ return {
57
+ type: resolved.type,
58
+ url: resolved.fileId,
59
+ mimeType: resolved.mimeType,
60
+ fileName: resolved.fileName,
61
+ fileSize: resolved.fileSize,
62
+ duration: resolved.duration,
63
+ width: resolved.width,
64
+ height: resolved.height,
65
+ };
66
+ }
67
+ //# sourceMappingURL=channel-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-convert.js","sourceRoot":"","sources":["../src/channel-convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * TelegramChannel - Main channel implementation
3
+ * Implements the EnhancedChannel interface for Telegram Bot API.
4
+ * Uses long polling, HTML formatting, and user allowlist enforcement.
5
+ */
6
+ import type { PollerLogger } from './poller';
7
+ import type { ChannelMessageType } from './types';
8
+ import type { RichChannelMessage, ChannelSendOptions, ChannelEventType } from '@daemux/plugin-sdk';
9
+ export declare class TelegramChannel {
10
+ readonly id = "telegram";
11
+ readonly type = "telegram";
12
+ connected: boolean;
13
+ private api;
14
+ private poller;
15
+ private config;
16
+ private logger;
17
+ private handlers;
18
+ constructor(logger?: PollerLogger);
19
+ /** Connect to Telegram by verifying the bot token and starting long polling. */
20
+ connect(config: Record<string, unknown>): Promise<void>;
21
+ /** Disconnect: stop polling and release resources. */
22
+ disconnect(): Promise<void>;
23
+ /** Send a text message, converting markdown to HTML if requested. */
24
+ sendText(chatId: string, text: string, options?: ChannelSendOptions): Promise<string>;
25
+ /** Send a media attachment (photo, video, audio, document, etc.). */
26
+ sendMedia(chatId: string, attachment: {
27
+ type: ChannelMessageType;
28
+ data: Buffer;
29
+ fileName: string;
30
+ mimeType?: string;
31
+ caption?: string;
32
+ }, options?: {
33
+ replyToId?: string;
34
+ }): Promise<string>;
35
+ /** Download a file by its Telegram file_id. */
36
+ downloadAttachment(fileId: string): Promise<{
37
+ data: Buffer;
38
+ mimeType?: string;
39
+ fileName?: string;
40
+ }>;
41
+ /** Register an event handler. Returns an unsubscribe function. */
42
+ on(event: ChannelEventType, handler: (...args: never[]) => void | Promise<void>): () => void;
43
+ /** Register a handler compatible with the basic Channel.onMessage interface. */
44
+ onMessage(handler: (message: RichChannelMessage) => Promise<void>): void;
45
+ /** Send a message via the basic Channel.send interface. */
46
+ send(target: {
47
+ channelId: string;
48
+ userId?: string;
49
+ threadId?: string;
50
+ }, message: string, options?: {
51
+ replyToId?: string;
52
+ }): Promise<string>;
53
+ private handleUpdate;
54
+ private formatText;
55
+ private sendSingleText;
56
+ private routeMediaSend;
57
+ private requireConnected;
58
+ private emit;
59
+ }
60
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,KAAK,EAAyC,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAiBnG,qBAAa,eAAe;IAC1B,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,IAAI,cAAc;IAC3B,SAAS,UAAS;IAElB,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAKd;gBAEU,MAAM,CAAC,EAAE,YAAY;IAQjC,gFAAgF;IAC1E,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB7D,sDAAsD;IAChD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,qEAAqE;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAe3F,qEAAqE;IAC/D,SAAS,CACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE;QACV,IAAI,EAAE,kBAAkB,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,EACD,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;IAOlB,+CAA+C;IACzC,kBAAkB,CACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAclE,kEAAkE;IAClE,EAAE,CACA,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClD,MAAM,IAAI;IAUb,gFAAgF;IAChF,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIxE,2DAA2D;IACrD,IAAI,CACR,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EACjE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC;YAYJ,YAAY;IAc1B,OAAO,CAAC,UAAU;YAKJ,cAAc;YA6Bd,cAAc;IAkC5B,OAAO,CAAC,gBAAgB;YAIV,IAAI;CAYnB"}