@will-17173/telegram-cli 0.4.1 → 0.5.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 +26 -4
- package/README.zh-CN.md +26 -4
- package/dist/cli/app.js +3 -1
- package/dist/cli/app.js.map +1 -1
- package/dist/commands/telegram.js +16 -1
- package/dist/commands/telegram.js.map +1 -1
- package/dist/commands/web.js +52 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/listen-commands/catalog.js +10 -0
- package/dist/listen-commands/catalog.js.map +1 -1
- package/dist/listen-commands/dispatch.js +5 -0
- package/dist/listen-commands/dispatch.js.map +1 -1
- package/dist/presenters/ink/listen-command-menu.js +10 -2
- package/dist/presenters/ink/listen-command-menu.js.map +1 -1
- package/dist/presenters/ink/listen-scroll.js +1 -1
- package/dist/presenters/ink/listen-scroll.js.map +1 -1
- package/dist/presenters/ink/listen.js +70 -9
- package/dist/presenters/ink/listen.js.map +1 -1
- package/dist/presenters/listen-message.js +1 -1
- package/dist/presenters/listen-message.js.map +1 -1
- package/dist/services/sync-service.js +33 -2
- package/dist/services/sync-service.js.map +1 -1
- package/dist/storage/message-db.js +145 -7
- package/dist/storage/message-db.js.map +1 -1
- package/dist/telegram/mtcute-client.js +33 -12
- package/dist/telegram/mtcute-client.js.map +1 -1
- package/dist/telegram/raw-media-location.js +132 -0
- package/dist/telegram/raw-media-location.js.map +1 -0
- package/dist/telegram/types.js.map +1 -1
- package/dist/web/api.js +304 -0
- package/dist/web/api.js.map +1 -0
- package/dist/web/assets/index-B5flee9s.js +9 -0
- package/dist/web/assets/index-w5LbzaUx.css +1 -0
- package/dist/web/index.html +13 -0
- package/dist/web/query.js +192 -0
- package/dist/web/query.js.map +1 -0
- package/dist/web/security.js +23 -0
- package/dist/web/security.js.map +1 -0
- package/dist/web/server.js +133 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/static.js +40 -0
- package/dist/web/static.js.map +1 -0
- package/dist/web/sync-task.js +165 -0
- package/dist/web/sync-task.js.map +1 -0
- package/dist/web/types.js +2 -0
- package/dist/web/types.js.map +1 -0
- package/package.json +9 -4
package/dist/web/api.js
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { resolveAuthenticatedAccountContext } from '../account/account-context.js';
|
|
5
|
+
import { getDataDir } from '../config/env.js';
|
|
6
|
+
import { resolveAttachmentDestination } from '../services/attachment-download.js';
|
|
7
|
+
import { MessageDB } from '../storage/message-db.js';
|
|
8
|
+
import { createTelegramClient } from '../telegram/client-factory.js';
|
|
9
|
+
import { fileLocationFromRawMessage } from '../telegram/raw-media-location.js';
|
|
10
|
+
import { validateLocalRequest } from './security.js';
|
|
11
|
+
import { WebQueryService } from './query.js';
|
|
12
|
+
export async function handleApiRequest(request, context) {
|
|
13
|
+
const security = validateLocalRequest(request, context.port);
|
|
14
|
+
if (!security.ok)
|
|
15
|
+
return failure(security.status, security.code, security.message);
|
|
16
|
+
const url = new URL(request.url);
|
|
17
|
+
try {
|
|
18
|
+
const dataDir = context.dataDir ?? getDataDir();
|
|
19
|
+
const query = new WebQueryService({ dataDir });
|
|
20
|
+
switch (url.pathname) {
|
|
21
|
+
case '/api/health':
|
|
22
|
+
if (request.method !== 'GET')
|
|
23
|
+
return notFound();
|
|
24
|
+
return success({ status: 'ok' });
|
|
25
|
+
case '/api/accounts':
|
|
26
|
+
if (request.method !== 'GET')
|
|
27
|
+
return notFound();
|
|
28
|
+
return success(query.accounts());
|
|
29
|
+
case '/api/chats':
|
|
30
|
+
if (request.method !== 'GET')
|
|
31
|
+
return notFound();
|
|
32
|
+
return success(query.chats({
|
|
33
|
+
account: stringParam(url, 'account'),
|
|
34
|
+
q: stringParam(url, 'q'),
|
|
35
|
+
limit: optionalPositiveIntParam(url, 'limit') ?? 100,
|
|
36
|
+
offset: optionalNonNegativeIntParam(url, 'offset') ?? 0,
|
|
37
|
+
}));
|
|
38
|
+
case '/api/messages':
|
|
39
|
+
if (request.method !== 'GET')
|
|
40
|
+
return notFound();
|
|
41
|
+
return success(query.messages({
|
|
42
|
+
account: stringParam(url, 'account'),
|
|
43
|
+
chatId: requiredNonZeroIntParam(url, 'chatId'),
|
|
44
|
+
q: stringParam(url, 'q'),
|
|
45
|
+
senderId: optionalIntParam(url, 'senderId'),
|
|
46
|
+
senderName: stringParam(url, 'senderName'),
|
|
47
|
+
text: stringParam(url, 'text'),
|
|
48
|
+
since: stringParam(url, 'since'),
|
|
49
|
+
until: stringParam(url, 'until'),
|
|
50
|
+
limit: optionalPositiveIntParam(url, 'limit') ?? 50,
|
|
51
|
+
cursor: stringParam(url, 'cursor'),
|
|
52
|
+
}));
|
|
53
|
+
case '/api/sync-task':
|
|
54
|
+
if (request.method === 'POST')
|
|
55
|
+
return await syncTaskPost(request, context);
|
|
56
|
+
if (request.method !== 'GET')
|
|
57
|
+
return notFound();
|
|
58
|
+
return success(context.syncTask.getState());
|
|
59
|
+
case '/api/download-media':
|
|
60
|
+
if (request.method !== 'POST')
|
|
61
|
+
return notFound();
|
|
62
|
+
return await downloadMediaPost(request, { dataDir });
|
|
63
|
+
default:
|
|
64
|
+
return notFound();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return errorResponse(error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function success(data) {
|
|
72
|
+
return jsonResponse(200, { ok: true, data });
|
|
73
|
+
}
|
|
74
|
+
function failure(status, code, message, details) {
|
|
75
|
+
return jsonResponse(status, { ok: false, error: { code, message, details } });
|
|
76
|
+
}
|
|
77
|
+
function notFound() {
|
|
78
|
+
return failure(404, 'not_found', 'API route not found.');
|
|
79
|
+
}
|
|
80
|
+
function jsonResponse(status, body) {
|
|
81
|
+
return new Response(JSON.stringify(body), {
|
|
82
|
+
status,
|
|
83
|
+
headers: { 'content-type': 'application/json; charset=utf-8' },
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async function syncTaskPost(request, context) {
|
|
87
|
+
if (!isJsonRequest(request)) {
|
|
88
|
+
return failure(400, 'invalid_request', 'Content-Type must include application/json.');
|
|
89
|
+
}
|
|
90
|
+
const body = await parseJsonBody(request);
|
|
91
|
+
if (!isRecord(body)) {
|
|
92
|
+
return failure(400, 'invalid_request', 'Request body must be a JSON object.');
|
|
93
|
+
}
|
|
94
|
+
const account = typeof body.account === 'string' ? body.account.trim() : '';
|
|
95
|
+
if (account === '') {
|
|
96
|
+
return failure(400, 'invalid_request', 'account must be a non-empty string.');
|
|
97
|
+
}
|
|
98
|
+
if (!isSafeNonZeroInteger(body.chatId)) {
|
|
99
|
+
return failure(400, 'invalid_request', 'chatId must be a non-zero integer.');
|
|
100
|
+
}
|
|
101
|
+
let limit = 500;
|
|
102
|
+
if (hasOwn(body, 'limit')) {
|
|
103
|
+
if (!isSafePositiveInteger(body.limit)) {
|
|
104
|
+
return failure(400, 'invalid_request', 'limit must be a positive integer.');
|
|
105
|
+
}
|
|
106
|
+
limit = body.limit;
|
|
107
|
+
}
|
|
108
|
+
const result = await context.syncTask.start({ account, chatId: body.chatId, limit });
|
|
109
|
+
if (result.ok)
|
|
110
|
+
return jsonResponse(200, result);
|
|
111
|
+
if (result.error.code === 'sync_task_running')
|
|
112
|
+
return jsonResponse(409, result);
|
|
113
|
+
if (result.error.code === 'invalid_request' || isAccountErrorCode(result.error.code))
|
|
114
|
+
return jsonResponse(400, result);
|
|
115
|
+
return jsonResponse(500, result);
|
|
116
|
+
}
|
|
117
|
+
async function downloadMediaPost(request, context) {
|
|
118
|
+
if (!isJsonRequest(request)) {
|
|
119
|
+
return failure(400, 'invalid_request', 'Content-Type must include application/json.');
|
|
120
|
+
}
|
|
121
|
+
const body = await parseJsonBody(request);
|
|
122
|
+
if (!isRecord(body))
|
|
123
|
+
return failure(400, 'invalid_request', 'Request body must be a JSON object.');
|
|
124
|
+
const account = typeof body.account === 'string' ? body.account.trim() : '';
|
|
125
|
+
if (account === '')
|
|
126
|
+
return failure(400, 'invalid_request', 'account must be a non-empty string.');
|
|
127
|
+
if (!Array.isArray(body.attachments) || body.attachments.length === 0) {
|
|
128
|
+
return failure(400, 'invalid_request', 'attachments must be a non-empty array.');
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const attachments = body.attachments.map(parseDownloadAttachment);
|
|
132
|
+
const reserved = new Set();
|
|
133
|
+
const clientContext = resolveAuthenticatedAccountContext({ explicitName: account, dataDir: context.dataDir });
|
|
134
|
+
const storedMessages = readStoredDownloadMessages(clientContext.dbPath, attachments);
|
|
135
|
+
const client = createTelegramClient(clientContext.sessionPath);
|
|
136
|
+
const results = [];
|
|
137
|
+
try {
|
|
138
|
+
for (const attachment of attachments) {
|
|
139
|
+
const destination = resolveAttachmentDestination({
|
|
140
|
+
homeDir: homedir(),
|
|
141
|
+
fileName: attachment.fileName,
|
|
142
|
+
exists: existsSync,
|
|
143
|
+
reserved,
|
|
144
|
+
});
|
|
145
|
+
reserved.add(destination);
|
|
146
|
+
mkdirSync(dirname(destination), { recursive: true });
|
|
147
|
+
await client.downloadMessageMedia({
|
|
148
|
+
chat: attachment.chatId,
|
|
149
|
+
msgId: attachment.msgId,
|
|
150
|
+
destination,
|
|
151
|
+
location: storedMessages.get(downloadMessageKey(attachment.chatId, attachment.msgId)),
|
|
152
|
+
});
|
|
153
|
+
results.push({
|
|
154
|
+
chat_id: attachment.chatId,
|
|
155
|
+
msg_id: attachment.msgId,
|
|
156
|
+
file_name: attachment.fileName,
|
|
157
|
+
path: destination,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
await client.close();
|
|
163
|
+
}
|
|
164
|
+
return success({ downloaded: results });
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
const message = errorMessage(error);
|
|
168
|
+
if (isKnownValidationMessage(message))
|
|
169
|
+
return failure(400, 'invalid_request', message);
|
|
170
|
+
return failure(500, 'download_failed', message);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function readStoredDownloadMessages(dbPath, attachments) {
|
|
174
|
+
const db = new MessageDB(dbPath, { readonly: true });
|
|
175
|
+
try {
|
|
176
|
+
return new Map(db.getMessagesByKeys(attachments).map((message) => [
|
|
177
|
+
downloadMessageKey(message.chat_id, message.msg_id),
|
|
178
|
+
fileLocationFromRawMessage(message.raw_json),
|
|
179
|
+
]));
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
db.close();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function downloadMessageKey(chatId, msgId) {
|
|
186
|
+
return `${chatId}:${msgId}`;
|
|
187
|
+
}
|
|
188
|
+
function parseDownloadAttachment(value) {
|
|
189
|
+
if (!isRecord(value))
|
|
190
|
+
throw invalidRequest('Each attachment must be a JSON object.');
|
|
191
|
+
if (!isSafeNonZeroInteger(value.chat_id))
|
|
192
|
+
throw invalidRequest('attachment.chat_id must be a non-zero integer.');
|
|
193
|
+
if (!isSafePositiveInteger(value.msg_id))
|
|
194
|
+
throw invalidRequest('attachment.msg_id must be a positive integer.');
|
|
195
|
+
const fileName = typeof value.file_name === 'string' ? value.file_name.trim() : '';
|
|
196
|
+
if (fileName === '')
|
|
197
|
+
throw invalidRequest('attachment.file_name must be a non-empty string.');
|
|
198
|
+
return { chatId: value.chat_id, msgId: value.msg_id, fileName };
|
|
199
|
+
}
|
|
200
|
+
function isJsonRequest(request) {
|
|
201
|
+
return request.headers.get('content-type')?.toLowerCase().includes('application/json') ?? false;
|
|
202
|
+
}
|
|
203
|
+
async function parseJsonBody(request) {
|
|
204
|
+
try {
|
|
205
|
+
return await request.json();
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function isRecord(value) {
|
|
212
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
213
|
+
}
|
|
214
|
+
function hasOwn(value, key) {
|
|
215
|
+
return Object.prototype.hasOwnProperty.call(value, key);
|
|
216
|
+
}
|
|
217
|
+
function isSafePositiveInteger(value) {
|
|
218
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
|
|
219
|
+
}
|
|
220
|
+
function isSafeNonZeroInteger(value) {
|
|
221
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value !== 0;
|
|
222
|
+
}
|
|
223
|
+
function isAccountErrorCode(code) {
|
|
224
|
+
return code === 'account_required'
|
|
225
|
+
|| code === 'account_not_found'
|
|
226
|
+
|| code === 'account_logged_out'
|
|
227
|
+
|| code === 'account_session_missing';
|
|
228
|
+
}
|
|
229
|
+
function stringParam(url, name) {
|
|
230
|
+
const value = url.searchParams.get(name);
|
|
231
|
+
return value == null || value.trim() === '' ? undefined : value;
|
|
232
|
+
}
|
|
233
|
+
function requiredNonZeroIntParam(url, name) {
|
|
234
|
+
const value = parseInteger(url.searchParams.get(name));
|
|
235
|
+
if (value == null || value === 0)
|
|
236
|
+
throw invalidRequest(`${name} must be a non-zero integer.`);
|
|
237
|
+
return value;
|
|
238
|
+
}
|
|
239
|
+
function optionalPositiveIntParam(url, name) {
|
|
240
|
+
const raw = url.searchParams.get(name);
|
|
241
|
+
if (raw == null || raw.trim() === '')
|
|
242
|
+
return undefined;
|
|
243
|
+
const value = parseInteger(raw);
|
|
244
|
+
if (value == null || value <= 0)
|
|
245
|
+
throw invalidRequest(`${name} must be a positive integer.`);
|
|
246
|
+
return value;
|
|
247
|
+
}
|
|
248
|
+
function optionalNonNegativeIntParam(url, name) {
|
|
249
|
+
const raw = url.searchParams.get(name);
|
|
250
|
+
if (raw == null || raw.trim() === '')
|
|
251
|
+
return undefined;
|
|
252
|
+
const value = parseInteger(raw);
|
|
253
|
+
if (value == null || value < 0)
|
|
254
|
+
throw invalidRequest(`${name} must be a non-negative integer.`);
|
|
255
|
+
return value;
|
|
256
|
+
}
|
|
257
|
+
function optionalIntParam(url, name) {
|
|
258
|
+
const raw = url.searchParams.get(name);
|
|
259
|
+
if (raw == null || raw.trim() === '')
|
|
260
|
+
return undefined;
|
|
261
|
+
const value = parseInteger(raw);
|
|
262
|
+
if (value == null)
|
|
263
|
+
throw invalidRequest(`${name} must be an integer.`);
|
|
264
|
+
return value;
|
|
265
|
+
}
|
|
266
|
+
function parseInteger(raw) {
|
|
267
|
+
if (raw == null)
|
|
268
|
+
return undefined;
|
|
269
|
+
const value = raw.trim();
|
|
270
|
+
if (!/^-?\d+$/.test(value))
|
|
271
|
+
return undefined;
|
|
272
|
+
const parsed = Number(value);
|
|
273
|
+
return Number.isSafeInteger(parsed) ? parsed : undefined;
|
|
274
|
+
}
|
|
275
|
+
function invalidRequest(message) {
|
|
276
|
+
return { status: 400, code: 'invalid_request', message };
|
|
277
|
+
}
|
|
278
|
+
function errorResponse(error) {
|
|
279
|
+
if (isApiError(error))
|
|
280
|
+
return failure(error.status, error.code, error.message);
|
|
281
|
+
const message = errorMessage(error);
|
|
282
|
+
if (isKnownValidationMessage(message))
|
|
283
|
+
return failure(400, 'invalid_request', message);
|
|
284
|
+
return failure(500, 'internal_error', 'Internal web API error.');
|
|
285
|
+
}
|
|
286
|
+
function isApiError(error) {
|
|
287
|
+
return typeof error === 'object'
|
|
288
|
+
&& error !== null
|
|
289
|
+
&& error.status === 400
|
|
290
|
+
&& error.code === 'invalid_request'
|
|
291
|
+
&& typeof error.message === 'string';
|
|
292
|
+
}
|
|
293
|
+
function isKnownValidationMessage(message) {
|
|
294
|
+
return message === 'invalid_cursor'
|
|
295
|
+
|| message.includes('must be a positive integer')
|
|
296
|
+
|| message.startsWith('account_required:')
|
|
297
|
+
|| message.startsWith('account_not_found:')
|
|
298
|
+
|| message.startsWith('account_logged_out:')
|
|
299
|
+
|| message.startsWith('account_session_missing:');
|
|
300
|
+
}
|
|
301
|
+
function errorMessage(error) {
|
|
302
|
+
return error instanceof Error ? error.message : String(error);
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/web/api.ts"],"names":[],"mappings":"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"}
|