@krischoichoi/channel-telegram 0.6.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.
- package/README.md +129 -0
- package/lib/adapter.d.ts +94 -0
- package/lib/adapter.d.ts.map +1 -0
- package/lib/adapter.js +417 -0
- package/lib/adapter.js.map +1 -0
- package/lib/api-error.d.ts +74 -0
- package/lib/api-error.d.ts.map +1 -0
- package/lib/api-error.js +103 -0
- package/lib/api-error.js.map +1 -0
- package/lib/config.d.ts +115 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +67 -0
- package/lib/config.js.map +1 -0
- package/lib/definition.d.ts +59 -0
- package/lib/definition.d.ts.map +1 -0
- package/lib/definition.js +158 -0
- package/lib/definition.js.map +1 -0
- package/lib/inbound.d.ts +61 -0
- package/lib/inbound.d.ts.map +1 -0
- package/lib/inbound.js +125 -0
- package/lib/inbound.js.map +1 -0
- package/lib/index.d.ts +52 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +114 -0
- package/lib/index.js.map +1 -0
- package/lib/manifest.d.ts +16 -0
- package/lib/manifest.d.ts.map +1 -0
- package/lib/manifest.js +26 -0
- package/lib/manifest.js.map +1 -0
- package/lib/mapper.d.ts +51 -0
- package/lib/mapper.d.ts.map +1 -0
- package/lib/mapper.js +314 -0
- package/lib/mapper.js.map +1 -0
- package/lib/media-hydrator.d.ts +46 -0
- package/lib/media-hydrator.d.ts.map +1 -0
- package/lib/media-hydrator.js +85 -0
- package/lib/media-hydrator.js.map +1 -0
- package/lib/outbound.d.ts +42 -0
- package/lib/outbound.d.ts.map +1 -0
- package/lib/outbound.js +215 -0
- package/lib/outbound.js.map +1 -0
- package/lib/render/html.d.ts +13 -0
- package/lib/render/html.d.ts.map +1 -0
- package/lib/render/html.js +110 -0
- package/lib/render/html.js.map +1 -0
- package/lib/render/index.d.ts +64 -0
- package/lib/render/index.d.ts.map +1 -0
- package/lib/render/index.js +76 -0
- package/lib/render/index.js.map +1 -0
- package/lib/render/markdown.d.ts +38 -0
- package/lib/render/markdown.d.ts.map +1 -0
- package/lib/render/markdown.js +187 -0
- package/lib/render/markdown.js.map +1 -0
- package/lib/render/plain.d.ts +43 -0
- package/lib/render/plain.d.ts.map +1 -0
- package/lib/render/plain.js +97 -0
- package/lib/render/plain.js.map +1 -0
- package/lib/render/segment.d.ts +39 -0
- package/lib/render/segment.d.ts.map +1 -0
- package/lib/render/segment.js +117 -0
- package/lib/render/segment.js.map +1 -0
- package/lib/rich-message.d.ts +75 -0
- package/lib/rich-message.d.ts.map +1 -0
- package/lib/rich-message.js +11 -0
- package/lib/rich-message.js.map +1 -0
- package/lib/rich-streaming-reply.d.ts +69 -0
- package/lib/rich-streaming-reply.d.ts.map +1 -0
- package/lib/rich-streaming-reply.js +207 -0
- package/lib/rich-streaming-reply.js.map +1 -0
- package/lib/streaming-reply.d.ts +98 -0
- package/lib/streaming-reply.d.ts.map +1 -0
- package/lib/streaming-reply.js +274 -0
- package/lib/streaming-reply.js.map +1 -0
- package/lib/transport.d.ts +38 -0
- package/lib/transport.d.ts.map +1 -0
- package/lib/transport.js +91 -0
- package/lib/transport.js.map +1 -0
- package/lib/upstream.d.ts +174 -0
- package/lib/upstream.d.ts.map +1 -0
- package/lib/upstream.js +452 -0
- package/lib/upstream.js.map +1 -0
- package/package.json +52 -0
package/lib/upstream.js
ADDED
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram upstream driver — the only module that knows the Bot API.
|
|
3
|
+
*
|
|
4
|
+
* The upstream is SDK-agnostic: it speaks the Telegram Bot API HTTP protocol
|
|
5
|
+
* directly (`/bot<token>/...`), so no SDK dependency is required (manifest
|
|
6
|
+
* strategy 'source'). The token only ever appears in the request path built
|
|
7
|
+
* here; it is never logged and never cached beyond the config value.
|
|
8
|
+
*
|
|
9
|
+
* Long-poll semantics: every getUpdates call carries the acknowledged offset,
|
|
10
|
+
* so Telegram stops redelivering confirmed updates (the offset IS the
|
|
11
|
+
* protocol-level dedup mechanism). The InboundProcessor dedup window is the
|
|
12
|
+
* adapter-level second layer for webhook-style redelivery inside one cycle.
|
|
13
|
+
*
|
|
14
|
+
* ## Structured errors (plan §3.1 / §5.4)
|
|
15
|
+
*
|
|
16
|
+
* Every non-ok / invalid envelope is converted at this boundary into a
|
|
17
|
+
* `TelegramApiError` (see `api-error.ts`) that preserves Telegram's
|
|
18
|
+
* `error_code` / `description` / `parameters` and carries a stable kind. This
|
|
19
|
+
* lets the renderer and reply engine distinguish a formatting parse failure
|
|
20
|
+
* (→ one-shot plain fallback) from 401/403 / 429 / network / 5xx without
|
|
21
|
+
* re-classifying raw numbers.
|
|
22
|
+
*/
|
|
23
|
+
import { ChannelError, mimeHintFromFilename, normalizeMimeHint, } from '@krischoichoi/channel-core';
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
import { classifyTelegramError, TelegramApiError } from './api-error.js';
|
|
26
|
+
/**
|
|
27
|
+
* Bot API envelope shared by every method: `{ ok, result?, error_code?,
|
|
28
|
+
* description?, parameters? }`. Validated with zod (not hand-rolled casts) at
|
|
29
|
+
* the upstream boundary, matching the official adapters' response-validation
|
|
30
|
+
* pattern.
|
|
31
|
+
*/
|
|
32
|
+
const apiResponseSchema = z.object({
|
|
33
|
+
ok: z.boolean(),
|
|
34
|
+
result: z.unknown().optional(),
|
|
35
|
+
error_code: z.number().optional(),
|
|
36
|
+
description: z.string().optional(),
|
|
37
|
+
parameters: z.object({
|
|
38
|
+
retry_after: z.number().optional(),
|
|
39
|
+
migrate_to_chat_id: z.number().optional(),
|
|
40
|
+
}).optional(),
|
|
41
|
+
}).passthrough();
|
|
42
|
+
/** `getMe` result: the bot user. */
|
|
43
|
+
const botUserSchema = z.object({
|
|
44
|
+
id: z.number(),
|
|
45
|
+
is_bot: z.boolean(),
|
|
46
|
+
first_name: z.string().optional(),
|
|
47
|
+
username: z.string().optional(),
|
|
48
|
+
}).passthrough();
|
|
49
|
+
/** `getUpdates` result: a list of raw updates (shape owned by the mapper). */
|
|
50
|
+
const getUpdatesResultSchema = z.array(z.object({
|
|
51
|
+
update_id: z.number(),
|
|
52
|
+
}).passthrough());
|
|
53
|
+
/** `sendMessage` result: the sent message id. */
|
|
54
|
+
const sentMessageSchema = z.object({
|
|
55
|
+
message_id: z.number(),
|
|
56
|
+
}).passthrough();
|
|
57
|
+
/** `getFile` result: file metadata, including the download path. */
|
|
58
|
+
const fileSchema = z.object({
|
|
59
|
+
file_id: z.string(),
|
|
60
|
+
file_unique_id: z.string(),
|
|
61
|
+
file_size: z.number().optional(),
|
|
62
|
+
file_path: z.string().optional(),
|
|
63
|
+
mime_type: z.string().optional(),
|
|
64
|
+
file_name: z.string().optional(),
|
|
65
|
+
}).passthrough();
|
|
66
|
+
/** HTTP implementation over the Telegram Bot API. */
|
|
67
|
+
export class HttpTelegramUpstream {
|
|
68
|
+
options;
|
|
69
|
+
constructor(options) {
|
|
70
|
+
this.options = options;
|
|
71
|
+
}
|
|
72
|
+
path(endpoint) {
|
|
73
|
+
return `/bot${this.options.token ?? ''}/${endpoint}`;
|
|
74
|
+
}
|
|
75
|
+
filePath(filePath) {
|
|
76
|
+
return `/file/bot${this.options.token ?? ''}/${filePath.replace(/^\/+/, '')}`;
|
|
77
|
+
}
|
|
78
|
+
async getMe() {
|
|
79
|
+
const envelope = await this.requestOk('getMe');
|
|
80
|
+
const user = botUserSchema.safeParse(envelope.data.result);
|
|
81
|
+
if (!user.success) {
|
|
82
|
+
throw new ChannelError('CHANNEL_ERROR', 'telegram getMe returned no bot user');
|
|
83
|
+
}
|
|
84
|
+
return user.data;
|
|
85
|
+
}
|
|
86
|
+
async deleteWebhook() {
|
|
87
|
+
const raw = await this.post('deleteWebhook', { drop_pending_updates: false });
|
|
88
|
+
const envelope = this.parseEnvelope('deleteWebhook', raw);
|
|
89
|
+
if (!envelope.data.ok || envelope.data.result !== true) {
|
|
90
|
+
throw this.apiError('deleteWebhook', envelope.data);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async getUpdates(cursor, signal, onUpdate, onPoll) {
|
|
94
|
+
while (!signal.aborted) {
|
|
95
|
+
let raw;
|
|
96
|
+
try {
|
|
97
|
+
raw = await this.options.transport.request(this.path('getUpdates'), {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
body: {
|
|
100
|
+
offset: cursor.offset,
|
|
101
|
+
// Telegram's long-poll timeout parameter is in seconds; the
|
|
102
|
+
// HTTP request timeout must exceed it so the fetch outlives
|
|
103
|
+
// the poll window.
|
|
104
|
+
timeout: Math.max(1, Math.floor(this.options.longPollTimeoutMs / 1000)),
|
|
105
|
+
// Plan §3.4 / §5: subscribe to interactive callback_query updates
|
|
106
|
+
// in addition to plain messages.
|
|
107
|
+
allowed_updates: ['message', 'callback_query'],
|
|
108
|
+
},
|
|
109
|
+
timeoutMs: this.options.longPollTimeoutMs + 5000,
|
|
110
|
+
}, signal);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
// Abort-driven teardown exits gracefully; other failures propagate to
|
|
114
|
+
// the adapter, which owns reconnect/backoff.
|
|
115
|
+
if (signal.aborted)
|
|
116
|
+
return;
|
|
117
|
+
throw this.networkError('getUpdates', error);
|
|
118
|
+
}
|
|
119
|
+
const envelope = this.parseEnvelope('getUpdates', raw);
|
|
120
|
+
if (!envelope.data.ok) {
|
|
121
|
+
throw this.apiError('getUpdates', envelope.data);
|
|
122
|
+
}
|
|
123
|
+
const result = getUpdatesResultSchema.safeParse(envelope.data.result ?? []);
|
|
124
|
+
if (!result.success) {
|
|
125
|
+
throw new ChannelError('CHANNEL_ERROR', 'telegram getUpdates returned an invalid response');
|
|
126
|
+
}
|
|
127
|
+
onPoll?.();
|
|
128
|
+
for (const update of result.data) {
|
|
129
|
+
if (signal.aborted)
|
|
130
|
+
return;
|
|
131
|
+
await onUpdate(update);
|
|
132
|
+
// Commit only after dispatch succeeds. The shared cursor survives a
|
|
133
|
+
// thrown handler and is reused by the adapter's reconnect attempt.
|
|
134
|
+
cursor.offset = Math.max(cursor.offset, update.update_id + 1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async sendText(chatId, text, options) {
|
|
139
|
+
return this.sendMessage(chatId, text, options);
|
|
140
|
+
}
|
|
141
|
+
async sendMessage(chatId, text, options, format) {
|
|
142
|
+
const envelope = await this.sendMessageRaw(chatId, text, options, format);
|
|
143
|
+
return this.sentMessage('sendMessage', envelope.data);
|
|
144
|
+
}
|
|
145
|
+
/** Send a formatted text message; returns the parsed, ok-checked envelope. */
|
|
146
|
+
async sendMessageRaw(chatId, text, options, format) {
|
|
147
|
+
const raw = await this.post('sendMessage', this.messageBody(chatId, { text }, options, format));
|
|
148
|
+
const envelope = this.parseEnvelope('sendMessage', raw);
|
|
149
|
+
if (!envelope.data.ok) {
|
|
150
|
+
throw this.apiError('sendMessage', envelope.data);
|
|
151
|
+
}
|
|
152
|
+
return envelope;
|
|
153
|
+
}
|
|
154
|
+
async editMessageText(chatId, messageId, text, format) {
|
|
155
|
+
const body = {
|
|
156
|
+
chat_id: chatId,
|
|
157
|
+
message_id: Number(messageId),
|
|
158
|
+
text,
|
|
159
|
+
};
|
|
160
|
+
this.applyFormatToBody(body, format, false);
|
|
161
|
+
const raw = await this.post('editMessageText', body);
|
|
162
|
+
const envelope = this.parseEnvelope('editMessageText', raw);
|
|
163
|
+
if (!envelope.data.ok) {
|
|
164
|
+
throw this.apiError('editMessageText', envelope.data);
|
|
165
|
+
}
|
|
166
|
+
return envelope.data.result;
|
|
167
|
+
}
|
|
168
|
+
async editMessageReplyMarkup(chatId, messageId, replyMarkup) {
|
|
169
|
+
const body = {
|
|
170
|
+
chat_id: chatId,
|
|
171
|
+
message_id: Number(messageId),
|
|
172
|
+
};
|
|
173
|
+
if (replyMarkup !== undefined)
|
|
174
|
+
body.reply_markup = replyMarkup;
|
|
175
|
+
const raw = await this.post('editMessageReplyMarkup', body);
|
|
176
|
+
const envelope = this.parseEnvelope('editMessageReplyMarkup', raw);
|
|
177
|
+
if (!envelope.data.ok) {
|
|
178
|
+
throw this.apiError('editMessageReplyMarkup', envelope.data);
|
|
179
|
+
}
|
|
180
|
+
return envelope.data.result;
|
|
181
|
+
}
|
|
182
|
+
async sendRichMessage(chatId, message, options, format) {
|
|
183
|
+
const raw = await this.post('sendRichMessage', this.messageBody(chatId, { rich_message: message }, options, format?.replyMarkup ? { replyMarkup: format.replyMarkup } : undefined));
|
|
184
|
+
const envelope = this.parseEnvelope('sendRichMessage', raw);
|
|
185
|
+
if (!envelope.data.ok) {
|
|
186
|
+
throw this.apiError('sendRichMessage', envelope.data);
|
|
187
|
+
}
|
|
188
|
+
return this.sentMessage('sendRichMessage', envelope.data);
|
|
189
|
+
}
|
|
190
|
+
async sendRichMessageDraft(chatId, draftId, message, options) {
|
|
191
|
+
const numericChatId = Number(chatId);
|
|
192
|
+
if (!Number.isSafeInteger(numericChatId)) {
|
|
193
|
+
throw new ChannelError('CHANNEL_ERROR', 'telegram rich drafts require a numeric private chat id');
|
|
194
|
+
}
|
|
195
|
+
const raw = await this.post('sendRichMessageDraft', {
|
|
196
|
+
chat_id: numericChatId,
|
|
197
|
+
draft_id: draftId,
|
|
198
|
+
rich_message: message,
|
|
199
|
+
...(options?.messageThreadId ? { message_thread_id: Number(options.messageThreadId) } : {}),
|
|
200
|
+
});
|
|
201
|
+
const envelope = this.parseEnvelope('sendRichMessageDraft', raw);
|
|
202
|
+
if (!envelope.data.ok) {
|
|
203
|
+
throw this.apiError('sendRichMessageDraft', envelope.data);
|
|
204
|
+
}
|
|
205
|
+
return envelope.data.result;
|
|
206
|
+
}
|
|
207
|
+
async editMessageRich(chatId, messageId, message, replyMarkup) {
|
|
208
|
+
const raw = await this.post('editMessageText', {
|
|
209
|
+
chat_id: chatId,
|
|
210
|
+
message_id: Number(messageId),
|
|
211
|
+
rich_message: message,
|
|
212
|
+
...(replyMarkup ? { reply_markup: replyMarkup } : {}),
|
|
213
|
+
});
|
|
214
|
+
const envelope = this.parseEnvelope('editMessageText', raw);
|
|
215
|
+
if (!envelope.data.ok) {
|
|
216
|
+
throw this.apiError('editMessageText', envelope.data);
|
|
217
|
+
}
|
|
218
|
+
return envelope.data.result;
|
|
219
|
+
}
|
|
220
|
+
async answerCallbackQuery(params) {
|
|
221
|
+
const raw = await this.post('answerCallbackQuery', { callback_query_id: params.callback_query_id });
|
|
222
|
+
const envelope = this.parseEnvelope('answerCallbackQuery', raw);
|
|
223
|
+
if (!envelope.data.ok) {
|
|
224
|
+
throw this.apiError('answerCallbackQuery', envelope.data);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async getFile(fileId) {
|
|
228
|
+
const raw = await this.post('getFile', { file_id: fileId });
|
|
229
|
+
const envelope = this.parseEnvelope('getFile', raw);
|
|
230
|
+
if (!envelope.data.ok) {
|
|
231
|
+
throw this.apiError('getFile', envelope.data);
|
|
232
|
+
}
|
|
233
|
+
const file = fileSchema.safeParse(envelope.data.result);
|
|
234
|
+
if (!file.success) {
|
|
235
|
+
throw new ChannelError('CHANNEL_ERROR', 'telegram getFile returned no file metadata');
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
fileId: file.data.file_id,
|
|
239
|
+
fileUniqueId: file.data.file_unique_id,
|
|
240
|
+
fileSize: file.data.file_size,
|
|
241
|
+
filePath: file.data.file_path,
|
|
242
|
+
mimeType: file.data.mime_type,
|
|
243
|
+
fileName: file.data.file_name,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
async downloadFile(fileId, signal) {
|
|
247
|
+
const file = await this.getFile(fileId);
|
|
248
|
+
if (!file.filePath) {
|
|
249
|
+
throw new ChannelError('CHANNEL_ERROR', 'telegram getFile returned no file_path');
|
|
250
|
+
}
|
|
251
|
+
if (!this.options.transport.requestBinary) {
|
|
252
|
+
throw new ChannelError('CHANNEL_UNSUPPORTED', 'telegram transport does not support binary downloads');
|
|
253
|
+
}
|
|
254
|
+
// Keep the transport receiver intact. FetchTransport.requestBinary uses
|
|
255
|
+
// `this.requestResponse`; extracting the method would lose that binding.
|
|
256
|
+
const response = await this.options.transport.requestBinary(this.filePath(file.filePath), {}, signal);
|
|
257
|
+
const pathName = file.filePath.split('/').pop();
|
|
258
|
+
const name = file.fileName ?? filenameFromDisposition(response.contentDisposition) ?? pathName;
|
|
259
|
+
const mimeType = normalizeMimeHint(file.mimeType)
|
|
260
|
+
?? normalizeMimeHint(response.contentType)
|
|
261
|
+
?? mimeHintFromFilename(name);
|
|
262
|
+
return { data: response.data, mimeType, name };
|
|
263
|
+
}
|
|
264
|
+
async sendMedia(chatId, media, options, format) {
|
|
265
|
+
const endpointAndField = {
|
|
266
|
+
image: ['sendPhoto', 'photo'],
|
|
267
|
+
file: ['sendDocument', 'document'],
|
|
268
|
+
audio: ['sendAudio', 'audio'],
|
|
269
|
+
video: ['sendVideo', 'video'],
|
|
270
|
+
};
|
|
271
|
+
const [endpoint, field] = endpointAndField[media.type];
|
|
272
|
+
if (media.localData) {
|
|
273
|
+
const form = new FormData();
|
|
274
|
+
form.append('chat_id', chatId);
|
|
275
|
+
form.append(field, new Blob([media.localData], { type: media.mimeType ?? 'application/octet-stream' }), media.name ?? defaultMediaName(media.type));
|
|
276
|
+
if (media.caption !== undefined)
|
|
277
|
+
form.append('caption', media.caption);
|
|
278
|
+
if (format?.parseMode !== undefined)
|
|
279
|
+
form.append('caption_parse_mode', format.parseMode);
|
|
280
|
+
if (format?.captionEntities !== undefined)
|
|
281
|
+
form.append('caption_entities', JSON.stringify(format.captionEntities));
|
|
282
|
+
if (format?.replyMarkup !== undefined)
|
|
283
|
+
form.append('reply_markup', JSON.stringify(format.replyMarkup));
|
|
284
|
+
this.appendSendOptions(form, options);
|
|
285
|
+
return this.sendMediaRequest(endpoint, form);
|
|
286
|
+
}
|
|
287
|
+
if (!media.url) {
|
|
288
|
+
throw new ChannelError('CHANNEL_UNSUPPORTED', 'telegram media requires localData, url, or resourceRef');
|
|
289
|
+
}
|
|
290
|
+
const mediaWithUrl = { ...media, url: media.url };
|
|
291
|
+
switch (media.type) {
|
|
292
|
+
case 'image':
|
|
293
|
+
return this.sendMediaRequest('sendPhoto', this.mediaBody(chatId, mediaWithUrl, 'photo', options, format));
|
|
294
|
+
case 'file':
|
|
295
|
+
return this.sendMediaRequest('sendDocument', this.mediaBody(chatId, mediaWithUrl, 'document', options, format));
|
|
296
|
+
case 'audio':
|
|
297
|
+
return this.sendMediaRequest('sendAudio', this.mediaBody(chatId, mediaWithUrl, 'audio', options, format));
|
|
298
|
+
case 'video':
|
|
299
|
+
return this.sendMediaRequest('sendVideo', this.mediaBody(chatId, mediaWithUrl, 'video', options, format));
|
|
300
|
+
default:
|
|
301
|
+
// Exhaustive over TelegramMedia['type']; kept for safety.
|
|
302
|
+
throw new ChannelError('CHANNEL_UNSUPPORTED', `telegram media type '${String(media.type)}' unsupported`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
mediaBody(chatId, media, field, options, format) {
|
|
306
|
+
const body = { chat_id: chatId, [field]: media.url };
|
|
307
|
+
if (media.caption !== undefined)
|
|
308
|
+
body.caption = media.caption;
|
|
309
|
+
this.applyFormatToBody(body, format, true);
|
|
310
|
+
return this.messageBody(chatId, body, options);
|
|
311
|
+
}
|
|
312
|
+
async sendChatAction(chatId, action, options) {
|
|
313
|
+
await this.requestOk('sendChatAction', {
|
|
314
|
+
chat_id: chatId,
|
|
315
|
+
action,
|
|
316
|
+
...(options?.messageThreadId ? { message_thread_id: Number(options.messageThreadId) } : {}),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
async sendMediaRequest(endpoint, body) {
|
|
320
|
+
const raw = await this.post(endpoint, body);
|
|
321
|
+
const envelope = this.parseEnvelope(endpoint, raw);
|
|
322
|
+
if (!envelope.data.ok) {
|
|
323
|
+
throw this.apiError(endpoint, envelope.data);
|
|
324
|
+
}
|
|
325
|
+
return this.sentMessage(endpoint, envelope.data);
|
|
326
|
+
}
|
|
327
|
+
/** Apply formatting fields to a JSON body (caption vs text variants). */
|
|
328
|
+
applyFormatToBody(body, format, caption) {
|
|
329
|
+
if (!format)
|
|
330
|
+
return;
|
|
331
|
+
if (caption) {
|
|
332
|
+
if (format.parseMode !== undefined)
|
|
333
|
+
body.caption_parse_mode = format.parseMode;
|
|
334
|
+
if (format.captionEntities !== undefined)
|
|
335
|
+
body.caption_entities = format.captionEntities;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
if (format.parseMode !== undefined)
|
|
339
|
+
body.parse_mode = format.parseMode;
|
|
340
|
+
if (format.entities !== undefined)
|
|
341
|
+
body.entities = format.entities;
|
|
342
|
+
}
|
|
343
|
+
if (format.replyMarkup !== undefined)
|
|
344
|
+
body.reply_markup = format.replyMarkup;
|
|
345
|
+
}
|
|
346
|
+
messageBody(chatId, body, options, format) {
|
|
347
|
+
const result = { chat_id: chatId, ...body };
|
|
348
|
+
if (options?.replyToMessageId) {
|
|
349
|
+
result.reply_parameters = { message_id: Number(options.replyToMessageId) };
|
|
350
|
+
}
|
|
351
|
+
if (options?.messageThreadId)
|
|
352
|
+
result.message_thread_id = Number(options.messageThreadId);
|
|
353
|
+
if (format)
|
|
354
|
+
this.applyFormatToBody(result, format, false);
|
|
355
|
+
return result;
|
|
356
|
+
}
|
|
357
|
+
appendSendOptions(form, options) {
|
|
358
|
+
if (options?.replyToMessageId) {
|
|
359
|
+
form.append('reply_parameters', JSON.stringify({ message_id: Number(options.replyToMessageId) }));
|
|
360
|
+
}
|
|
361
|
+
if (options?.messageThreadId)
|
|
362
|
+
form.append('message_thread_id', options.messageThreadId);
|
|
363
|
+
}
|
|
364
|
+
async post(endpoint, body) {
|
|
365
|
+
try {
|
|
366
|
+
return await this.options.transport.request(this.path(endpoint), { method: 'POST', body });
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
if (error instanceof TelegramApiError)
|
|
370
|
+
throw error;
|
|
371
|
+
throw this.networkError(endpoint, error);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Issue a request and return a parsed, ok-checked envelope — or throw a
|
|
376
|
+
* structured `TelegramApiError`. This is the single envelope boundary: the
|
|
377
|
+
* sendMessage "invalid response" catch-all is replaced here.
|
|
378
|
+
*/
|
|
379
|
+
async requestOk(endpoint, body) {
|
|
380
|
+
const raw = await this.post(endpoint, body ?? {});
|
|
381
|
+
const envelope = this.parseEnvelope(endpoint, raw);
|
|
382
|
+
if (!envelope.data.ok) {
|
|
383
|
+
throw this.apiError(endpoint, envelope.data);
|
|
384
|
+
}
|
|
385
|
+
return envelope;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Parse a raw response into the envelope shape; a body that is not a valid
|
|
389
|
+
* Bot API envelope is a network/protocol-level failure, not a format issue.
|
|
390
|
+
*/
|
|
391
|
+
parseEnvelope(endpoint, raw) {
|
|
392
|
+
const envelope = apiResponseSchema.safeParse(raw);
|
|
393
|
+
if (!envelope.success) {
|
|
394
|
+
throw new TelegramApiError({
|
|
395
|
+
method: endpoint,
|
|
396
|
+
kind: 'network',
|
|
397
|
+
description: 'invalid Bot API response envelope',
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
return envelope;
|
|
401
|
+
}
|
|
402
|
+
/** Validate every Bot API method that returns a Message through one boundary. */
|
|
403
|
+
sentMessage(endpoint, envelope) {
|
|
404
|
+
const sent = sentMessageSchema.safeParse(envelope.result);
|
|
405
|
+
if (!sent.success) {
|
|
406
|
+
throw new ChannelError('CHANNEL_ERROR', `telegram ${endpoint} returned no message_id`);
|
|
407
|
+
}
|
|
408
|
+
return { messageId: String(sent.data.message_id), raw: envelope };
|
|
409
|
+
}
|
|
410
|
+
/** Build a structured `TelegramApiError` from an ok=false envelope. */
|
|
411
|
+
apiError(endpoint, envelope) {
|
|
412
|
+
const params = envelope.parameters
|
|
413
|
+
? { retryAfter: envelope.parameters.retry_after, migrateToChatId: envelope.parameters.migrate_to_chat_id }
|
|
414
|
+
: undefined;
|
|
415
|
+
const kind = classifyTelegramError(envelope.error_code, envelope.description, params);
|
|
416
|
+
return new TelegramApiError({
|
|
417
|
+
method: endpoint,
|
|
418
|
+
errorCode: envelope.error_code,
|
|
419
|
+
description: envelope.description,
|
|
420
|
+
parameters: params,
|
|
421
|
+
kind,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
/** Wrap a transport/network failure into a structured network-kind error. */
|
|
425
|
+
networkError(endpoint, error) {
|
|
426
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
427
|
+
return new TelegramApiError({
|
|
428
|
+
method: endpoint,
|
|
429
|
+
kind: 'network',
|
|
430
|
+
description: message,
|
|
431
|
+
cause: error,
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
function filenameFromDisposition(value) {
|
|
436
|
+
if (!value)
|
|
437
|
+
return undefined;
|
|
438
|
+
const encoded = /filename\*=UTF-8''([^;]+)/i.exec(value)?.[1];
|
|
439
|
+
if (encoded) {
|
|
440
|
+
try {
|
|
441
|
+
return decodeURIComponent(encoded);
|
|
442
|
+
}
|
|
443
|
+
catch {
|
|
444
|
+
return encoded;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
return /filename="?([^";]+)"?/i.exec(value)?.[1]?.trim();
|
|
448
|
+
}
|
|
449
|
+
function defaultMediaName(type) {
|
|
450
|
+
return type === 'image' ? 'image' : type === 'file' ? 'file' : type === 'audio' ? 'audio' : 'video';
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=upstream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@krischoichoi/channel-telegram",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "git+https://github.com/krischoichoi/dsh-channels.git"
|
|
7
|
+
},
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"description": "Telegram Bot API channel adapter for DeepSeek Harness (credentials seam, control-plane definition, edit streaming, file hydration)",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "./lib/index.js",
|
|
14
|
+
"types": "./lib/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./lib/index.d.ts",
|
|
18
|
+
"default": "./lib/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./package.json": "./package.json"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"lib"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc -p tsconfig.json",
|
|
27
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
28
|
+
"test": "vitest run --passWithNoTests",
|
|
29
|
+
"clean": "rimraf lib"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@deepseek-ai/cordis": "^4.0.4",
|
|
33
|
+
"@deepseek-ai/dsh-credentials": "0.2.0-rc.2",
|
|
34
|
+
"@deepseek-ai/dsh-settings": "0.2.0-rc.2",
|
|
35
|
+
"@deepseek-ai/schemastery": "~3.18.4",
|
|
36
|
+
"@grammyjs/types": "4.0.0",
|
|
37
|
+
"@krischoichoi/channel-control": "workspace:*",
|
|
38
|
+
"@krischoichoi/channel-core": "workspace:*",
|
|
39
|
+
"mdast-util-from-markdown": "2.0.3",
|
|
40
|
+
"mdast-util-gfm": "3.1.0",
|
|
41
|
+
"mdast-util-to-markdown": "2.1.2",
|
|
42
|
+
"mdast-util-to-string": "4.0.0",
|
|
43
|
+
"micromark-extension-gfm": "3.0.0",
|
|
44
|
+
"zod": "^4.4.3"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/mdast": "4.0.4",
|
|
48
|
+
"@krischoichoi/channel-testkit": "workspace:*",
|
|
49
|
+
"rimraf": "^6.0.0"
|
|
50
|
+
},
|
|
51
|
+
"license": "MIT"
|
|
52
|
+
}
|