@will-17173/telegram-cli 0.2.0 → 0.4.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 +241 -61
- package/README.zh-CN.md +250 -73
- package/dist/account/account-authenticator.js +95 -0
- package/dist/account/account-authenticator.js.map +1 -0
- package/dist/account/account-context.js +7 -0
- package/dist/account/account-context.js.map +1 -1
- package/dist/account/account-name.js +17 -0
- package/dist/account/account-name.js.map +1 -0
- package/dist/account/account-presets.js +20 -3
- package/dist/account/account-presets.js.map +1 -1
- package/dist/account/account-store.js +277 -37
- package/dist/account/account-store.js.map +1 -1
- package/dist/cli/app.js +12 -1
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/output.js +21 -6
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/secure-input.js +408 -0
- package/dist/cli/secure-input.js.map +1 -0
- package/dist/commands/account-options.js +37 -7
- package/dist/commands/account-options.js.map +1 -1
- package/dist/commands/account.js +192 -66
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/archive.js +151 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/config.js +119 -12
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contact.js +58 -0
- package/dist/commands/contact.js.map +1 -0
- package/dist/commands/data.js +14 -7
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/dialog.js +156 -0
- package/dist/commands/dialog.js.map +1 -0
- package/dist/commands/folder.js +113 -0
- package/dist/commands/folder.js.map +1 -0
- package/dist/commands/group-write.js +128 -0
- package/dist/commands/group-write.js.map +1 -0
- package/dist/commands/group.js +43 -7
- package/dist/commands/group.js.map +1 -1
- package/dist/commands/notification.js +76 -0
- package/dist/commands/notification.js.map +1 -0
- package/dist/commands/query.js +22 -15
- package/dist/commands/query.js.map +1 -1
- package/dist/commands/telegram-runner.js +40 -18
- package/dist/commands/telegram-runner.js.map +1 -1
- package/dist/commands/telegram.js +172 -109
- package/dist/commands/telegram.js.map +1 -1
- package/dist/commands/time-range.js +39 -0
- package/dist/commands/time-range.js.map +1 -0
- package/dist/commands/types.js +3 -2
- package/dist/commands/types.js.map +1 -1
- package/dist/config/credential-store.js +24 -4
- package/dist/config/credential-store.js.map +1 -1
- package/dist/config/env.js +4 -1
- package/dist/config/env.js.map +1 -1
- package/dist/group-commands/catalog.js +79 -0
- package/dist/group-commands/catalog.js.map +1 -0
- package/dist/group-commands/executor.js +102 -0
- package/dist/group-commands/executor.js.map +1 -0
- package/dist/group-commands/parser.js +268 -0
- package/dist/group-commands/parser.js.map +1 -0
- package/dist/group-commands/tokenize.js +51 -0
- package/dist/group-commands/tokenize.js.map +1 -0
- package/dist/group-commands/types.js +2 -0
- package/dist/group-commands/types.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/listen-commands/catalog.js +61 -0
- package/dist/listen-commands/catalog.js.map +1 -0
- package/dist/listen-commands/dispatch.js +46 -0
- package/dist/listen-commands/dispatch.js.map +1 -0
- package/dist/listen-commands/match.js +113 -0
- package/dist/listen-commands/match.js.map +1 -0
- package/dist/presenters/group.js +40 -0
- package/dist/presenters/group.js.map +1 -1
- package/dist/presenters/human.js +135 -0
- package/dist/presenters/human.js.map +1 -1
- package/dist/presenters/ink/display-width.js +45 -7
- package/dist/presenters/ink/display-width.js.map +1 -1
- package/dist/presenters/ink/group-command-confirm.js +13 -0
- package/dist/presenters/ink/group-command-confirm.js.map +1 -0
- package/dist/presenters/ink/group-command-result.js +23 -0
- package/dist/presenters/ink/group-command-result.js.map +1 -0
- package/dist/presenters/ink/listen-command-menu.js +38 -0
- package/dist/presenters/ink/listen-command-menu.js.map +1 -0
- package/dist/presenters/ink/listen-scroll.js +9 -4
- package/dist/presenters/ink/listen-scroll.js.map +1 -1
- package/dist/presenters/ink/listen.js +572 -52
- package/dist/presenters/ink/listen.js.map +1 -1
- package/dist/presenters/ink/mouse-scroll.js +12 -0
- package/dist/presenters/ink/mouse-scroll.js.map +1 -1
- package/dist/presenters/ink/secure-input.js +68 -0
- package/dist/presenters/ink/secure-input.js.map +1 -0
- package/dist/presenters/ink/use-group-command.js +186 -0
- package/dist/presenters/ink/use-group-command.js.map +1 -0
- package/dist/presenters/listen-message.js +23 -6
- package/dist/presenters/listen-message.js.map +1 -1
- package/dist/presenters/logical-message.js +78 -0
- package/dist/presenters/logical-message.js.map +1 -0
- package/dist/presenters/markdown.js +54 -0
- package/dist/presenters/markdown.js.map +1 -0
- package/dist/presenters/structured.js +8 -3
- package/dist/presenters/structured.js.map +1 -1
- package/dist/services/account-session-service.js +241 -0
- package/dist/services/account-session-service.js.map +1 -0
- package/dist/services/archive-layout.js +61 -0
- package/dist/services/archive-layout.js.map +1 -0
- package/dist/services/archive-manifest.js +187 -0
- package/dist/services/archive-manifest.js.map +1 -0
- package/dist/services/archive-markdown.js +383 -0
- package/dist/services/archive-markdown.js.map +1 -0
- package/dist/services/archive-service.js +718 -0
- package/dist/services/archive-service.js.map +1 -0
- package/dist/services/archive-types.js +2 -0
- package/dist/services/archive-types.js.map +1 -0
- package/dist/services/attachment-download.js +7 -2
- package/dist/services/attachment-download.js.map +1 -1
- package/dist/services/auto-download-coordinator.js +2 -4
- package/dist/services/auto-download-coordinator.js.map +1 -1
- package/dist/services/contact-service.js +78 -0
- package/dist/services/contact-service.js.map +1 -0
- package/dist/services/dialog-service.js +140 -0
- package/dist/services/dialog-service.js.map +1 -0
- package/dist/services/folder-service.js +200 -0
- package/dist/services/folder-service.js.map +1 -0
- package/dist/services/group-service.js.map +1 -1
- package/dist/services/group-write-service.js +225 -0
- package/dist/services/group-write-service.js.map +1 -0
- package/dist/services/listen-album-aggregator.js +9 -29
- package/dist/services/listen-album-aggregator.js.map +1 -1
- package/dist/services/listen-attachment.js +23 -6
- package/dist/services/listen-attachment.js.map +1 -1
- package/dist/services/listen-composer-command.js +102 -0
- package/dist/services/listen-composer-command.js.map +1 -0
- package/dist/services/listen-reply-resolver.js +126 -0
- package/dist/services/listen-reply-resolver.js.map +1 -0
- package/dist/services/message-service.js +17 -1
- package/dist/services/message-service.js.map +1 -1
- package/dist/services/notification-service.js +142 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/query-service.js +59 -3
- package/dist/services/query-service.js.map +1 -1
- package/dist/services/reply-context.js +29 -0
- package/dist/services/reply-context.js.map +1 -0
- package/dist/services/write-access-policy.js +19 -0
- package/dist/services/write-access-policy.js.map +1 -0
- package/dist/storage/message-db.js +241 -5
- package/dist/storage/message-db.js.map +1 -1
- package/dist/telegram/archive-types.js +2 -0
- package/dist/telegram/archive-types.js.map +1 -0
- package/dist/telegram/client-factory.js +51 -11
- package/dist/telegram/client-factory.js.map +1 -1
- package/dist/telegram/contact-types.js +10 -0
- package/dist/telegram/contact-types.js.map +1 -0
- package/dist/telegram/dialog-types.js +2 -0
- package/dist/telegram/dialog-types.js.map +1 -0
- package/dist/telegram/errors.js +14 -0
- package/dist/telegram/errors.js.map +1 -0
- package/dist/telegram/fake-group-management.js +122 -0
- package/dist/telegram/fake-group-management.js.map +1 -1
- package/dist/telegram/folder-types.js +13 -0
- package/dist/telegram/folder-types.js.map +1 -0
- package/dist/telegram/group-types.js +40 -0
- package/dist/telegram/group-types.js.map +1 -1
- package/dist/telegram/group-write-types.js +29 -0
- package/dist/telegram/group-write-types.js.map +1 -0
- package/dist/telegram/mtcute-archive.js +190 -0
- package/dist/telegram/mtcute-archive.js.map +1 -0
- package/dist/telegram/mtcute-client.js +73 -12
- package/dist/telegram/mtcute-client.js.map +1 -1
- package/dist/telegram/mtcute-contacts.js +90 -0
- package/dist/telegram/mtcute-contacts.js.map +1 -0
- package/dist/telegram/mtcute-dialogs.js +186 -0
- package/dist/telegram/mtcute-dialogs.js.map +1 -0
- package/dist/telegram/mtcute-folders.js +318 -0
- package/dist/telegram/mtcute-folders.js.map +1 -0
- package/dist/telegram/mtcute-group-helpers.js +56 -0
- package/dist/telegram/mtcute-group-helpers.js.map +1 -0
- package/dist/telegram/mtcute-group-invites.js +82 -0
- package/dist/telegram/mtcute-group-invites.js.map +1 -0
- package/dist/telegram/mtcute-group-management.js +60 -31
- package/dist/telegram/mtcute-group-management.js.map +1 -1
- package/dist/telegram/mtcute-group-members.js +158 -0
- package/dist/telegram/mtcute-group-members.js.map +1 -0
- package/dist/telegram/mtcute-group-settings.js +146 -0
- package/dist/telegram/mtcute-group-settings.js.map +1 -0
- package/dist/telegram/mtcute-group-topics.js +63 -0
- package/dist/telegram/mtcute-group-topics.js.map +1 -0
- package/dist/telegram/mtcute-message-normalizer.js +63 -0
- package/dist/telegram/mtcute-message-normalizer.js.map +1 -0
- package/dist/telegram/mtcute-notifications.js +101 -0
- package/dist/telegram/mtcute-notifications.js.map +1 -0
- package/dist/telegram/notification-types.js +11 -0
- package/dist/telegram/notification-types.js.map +1 -0
- package/dist/telegram/raw-message.js +46 -0
- package/dist/telegram/raw-message.js.map +1 -0
- package/dist/telegram/types.js +6 -1
- package/dist/telegram/types.js.map +1 -1
- package/package.json +20 -10
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { discoverListenAttachments } from '../services/listen-attachment.js';
|
|
2
|
+
import { extractGroupedId, extractReplyToMessageId } from '../telegram/raw-message.js';
|
|
3
|
+
export function groupLogicalMessages(rows) {
|
|
4
|
+
const groups = new Map();
|
|
5
|
+
for (const row of rows) {
|
|
6
|
+
const key = logicalMessageKey(row);
|
|
7
|
+
const messages = groups.get(key);
|
|
8
|
+
if (messages == null)
|
|
9
|
+
groups.set(key, [row]);
|
|
10
|
+
else
|
|
11
|
+
messages.push(row);
|
|
12
|
+
}
|
|
13
|
+
return [...groups.entries()]
|
|
14
|
+
.map(([key, messages]) => toLogicalMessage(key, messages))
|
|
15
|
+
.sort(compareLogicalMessages);
|
|
16
|
+
}
|
|
17
|
+
export function logicalMessageKey(row) {
|
|
18
|
+
const groupedId = extractGroupedId(row.raw_json);
|
|
19
|
+
return groupedId == null
|
|
20
|
+
? `${row.platform}:${row.chat_id}:message:${row.msg_id}`
|
|
21
|
+
: `${row.platform}:${row.chat_id}:${groupedId}`;
|
|
22
|
+
}
|
|
23
|
+
export function summarizeLogicalMedia(message) {
|
|
24
|
+
const attachments = message.messages.flatMap(discoverListenAttachments);
|
|
25
|
+
if (attachments.length === 0)
|
|
26
|
+
return null;
|
|
27
|
+
if (attachments.length === 1 && attachments[0].kind === 'Document' && attachments[0].fileName != null) {
|
|
28
|
+
return `📎 Document: ${attachments[0].fileName}`;
|
|
29
|
+
}
|
|
30
|
+
const counts = new Map();
|
|
31
|
+
for (const attachment of attachments) {
|
|
32
|
+
counts.set(attachment.kind, (counts.get(attachment.kind) ?? 0) + 1);
|
|
33
|
+
}
|
|
34
|
+
const parts = [...counts].map(([kind, count]) => `${count} ${count === 1 ? kind : pluralizeKind(kind)}`);
|
|
35
|
+
return `📎 ${parts.join(', ')}`;
|
|
36
|
+
}
|
|
37
|
+
function toLogicalMessage(key, rows) {
|
|
38
|
+
const messages = [...rows].sort((left, right) => left.msg_id - right.msg_id);
|
|
39
|
+
return {
|
|
40
|
+
key,
|
|
41
|
+
messages,
|
|
42
|
+
first: messages[0],
|
|
43
|
+
content: messages.find((row) => row.content?.trim())?.content ?? null,
|
|
44
|
+
replyToMessageId: firstReplyId(messages),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function firstReplyId(messages) {
|
|
48
|
+
for (const message of messages) {
|
|
49
|
+
const replyId = extractReplyToMessageId(message.raw_json);
|
|
50
|
+
if (replyId != null)
|
|
51
|
+
return replyId;
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
function compareLogicalMessages(left, right) {
|
|
56
|
+
const timestampOrder = left.first.timestamp.localeCompare(right.first.timestamp);
|
|
57
|
+
if (timestampOrder !== 0)
|
|
58
|
+
return timestampOrder;
|
|
59
|
+
const leftId = storedId(left.first);
|
|
60
|
+
const rightId = storedId(right.first);
|
|
61
|
+
return leftId != null && rightId != null ? leftId - rightId : left.first.msg_id - right.first.msg_id;
|
|
62
|
+
}
|
|
63
|
+
function storedId(message) {
|
|
64
|
+
return 'id' in message && typeof message.id === 'number' ? message.id : null;
|
|
65
|
+
}
|
|
66
|
+
function pluralizeKind(kind) {
|
|
67
|
+
return MEDIA_KIND_PLURALS[kind] ?? `${kind}s`;
|
|
68
|
+
}
|
|
69
|
+
const MEDIA_KIND_PLURALS = {
|
|
70
|
+
Photo: 'Photos',
|
|
71
|
+
Video: 'Videos',
|
|
72
|
+
Document: 'Documents',
|
|
73
|
+
Audio: 'Audio',
|
|
74
|
+
Voice: 'Voice Messages',
|
|
75
|
+
Sticker: 'Stickers',
|
|
76
|
+
Animation: 'Animations',
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=logical-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logical-message.js","sourceRoot":"","sources":["../../src/presenters/logical-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function renderHumanMarkdown(output) {
|
|
2
|
+
switch (output.kind) {
|
|
3
|
+
case 'text':
|
|
4
|
+
return normalizeNewlines(output.text);
|
|
5
|
+
case 'detail': {
|
|
6
|
+
const rows = output.fields.map((field) => formatField(field.label, field.value));
|
|
7
|
+
return `# ${escapeMarkdownField(output.title)}\n\n${rows.join('\n')}`;
|
|
8
|
+
}
|
|
9
|
+
case 'summary': {
|
|
10
|
+
const rows = output.fields.map((field) => formatField(field.label, field.value));
|
|
11
|
+
const title = `# ${escapeMarkdownField(output.title)}\n\n${rows.join('\n')}`;
|
|
12
|
+
const table = output.table == null
|
|
13
|
+
? ''
|
|
14
|
+
: `\n\n${renderTable(output.table.columns, output.table.rows)}`;
|
|
15
|
+
return `${title}${table}`;
|
|
16
|
+
}
|
|
17
|
+
case 'table':
|
|
18
|
+
return `# ${escapeMarkdownField(output.title)}\n\n${renderTable(output.columns, output.rows)}`;
|
|
19
|
+
case 'timeline':
|
|
20
|
+
return `# ${escapeMarkdownField(output.title)}\n\n${renderTable(['PERIOD', 'COUNT'], output.rows.map((row) => [escapeMarkdownCell(row.period), escapeMarkdownCell(String(row.count))]))}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function renderMarkdownError(code, message) {
|
|
24
|
+
return `# Error\n\n- **Code:** \`${escapeMarkdownField(code)}\`\n- **Message:** ${escapeMarkdownField(message)}`;
|
|
25
|
+
}
|
|
26
|
+
function formatField(label, value) {
|
|
27
|
+
return `- **${escapeMarkdownField(label)}:** ${escapeMarkdownField(value)}`;
|
|
28
|
+
}
|
|
29
|
+
function renderTable(columns, rows) {
|
|
30
|
+
const header = columns.map((column) => escapeMarkdownField(column)).join(' | ');
|
|
31
|
+
const separator = columns.map(() => '---').join(' | ');
|
|
32
|
+
const body = rows.length === 0
|
|
33
|
+
? []
|
|
34
|
+
: rows.map((row) => `| ${row.map((cell) => escapeMarkdownCell(cell)).join(' | ')} |`);
|
|
35
|
+
return [`| ${header} |`, `| ${separator} |`, ...body].join('\n');
|
|
36
|
+
}
|
|
37
|
+
function escapeMarkdownField(value) {
|
|
38
|
+
return escapeMarkdown(value).replaceAll('\n', '<br>');
|
|
39
|
+
}
|
|
40
|
+
function escapeMarkdownCell(value) {
|
|
41
|
+
return escapeMarkdown(value).replaceAll('\n', '<br>');
|
|
42
|
+
}
|
|
43
|
+
function escapeMarkdown(value) {
|
|
44
|
+
return normalizeNewlines(value)
|
|
45
|
+
.replaceAll('\\', '\\\\')
|
|
46
|
+
.replaceAll('|', '\\|')
|
|
47
|
+
.replaceAll('`', '\\`');
|
|
48
|
+
}
|
|
49
|
+
function normalizeNewlines(value) {
|
|
50
|
+
return value
|
|
51
|
+
.replaceAll('\r\n', '\n')
|
|
52
|
+
.replaceAll('\r', '\n');
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/presenters/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import YAML from 'yaml';
|
|
2
2
|
const SCHEMA_VERSION = '1';
|
|
3
3
|
export function resolveOutputFormat(options) {
|
|
4
|
-
if (options.json && options.yaml) {
|
|
5
|
-
throw new Error('Use only one of --json or --
|
|
4
|
+
if (options.json && (options.yaml || options.markdown)) {
|
|
5
|
+
throw new Error('Use only one of --json, --yaml, or --markdown.');
|
|
6
|
+
}
|
|
7
|
+
if (options.yaml && options.markdown) {
|
|
8
|
+
throw new Error('Use only one of --json, --yaml, or --markdown.');
|
|
6
9
|
}
|
|
7
10
|
if (options.yaml)
|
|
8
11
|
return 'yaml';
|
|
9
12
|
if (options.json)
|
|
10
13
|
return 'json';
|
|
14
|
+
if (options.markdown)
|
|
15
|
+
return 'markdown';
|
|
11
16
|
const mode = (process.env.OUTPUT || 'auto').trim().toLowerCase();
|
|
12
|
-
if (mode === 'yaml' || mode === 'json' || mode === 'rich')
|
|
17
|
+
if (mode === 'yaml' || mode === 'json' || mode === 'rich' || mode === 'markdown')
|
|
13
18
|
return mode;
|
|
14
19
|
return options.isTty === false ? 'yaml' : 'rich';
|
|
15
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured.js","sourceRoot":"","sources":["../../src/presenters/structured.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,cAAc,GAAG,GAAG,CAAA;
|
|
1
|
+
{"version":3,"file":"structured.js","sourceRoot":"","sources":["../../src/presenters/structured.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,cAAc,GAAG,GAAG,CAAA;AAS1B,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,MAAM,CAAA;IAC/B,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,MAAM,CAAA;IAC/B,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,UAAU,CAAA;IAEvC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAChE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAA;IAC7F,OAAO,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAe,EAAE,OAAiB;IAC3E,MAAM,KAAK,GAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACxD,IAAI,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;IAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,MAAuB;IACtE,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;AAC3D,CAAC"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, mkdtempSync, renameSync, rmSync } from 'node:fs';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { authenticateAccountAt } from '../account/account-authenticator.js';
|
|
5
|
+
import { accountSessionPath } from '../account/account-presets.js';
|
|
6
|
+
import { createTelegramClient } from '../telegram/client-factory.js';
|
|
7
|
+
import { TelegramSessionTerminatedError } from '../telegram/types.js';
|
|
8
|
+
import { isCliInterruptedError } from '../cli/secure-input.js';
|
|
9
|
+
export class AccountSessionService {
|
|
10
|
+
options;
|
|
11
|
+
createClient;
|
|
12
|
+
authenticate;
|
|
13
|
+
createTemporaryDirectory;
|
|
14
|
+
removePath;
|
|
15
|
+
renamePath;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
this.createClient = options.createClient ?? createTelegramClient;
|
|
19
|
+
this.authenticate = options.authenticate ?? authenticateAccountAt;
|
|
20
|
+
this.createTemporaryDirectory = options.createTemporaryDirectory ?? mkdtempSync;
|
|
21
|
+
this.removePath = options.removePath ?? ((path) => rmSync(path, { recursive: true, force: true }));
|
|
22
|
+
this.renamePath = options.renamePath ?? renameSync;
|
|
23
|
+
}
|
|
24
|
+
async logout(input) {
|
|
25
|
+
return this.options.store.withLock(async () => {
|
|
26
|
+
const registry = this.options.store.read();
|
|
27
|
+
const account = findAccount(registry, input.name);
|
|
28
|
+
if (!account)
|
|
29
|
+
return accountNotFound(input.name);
|
|
30
|
+
if (account.auth_state === 'logged_out')
|
|
31
|
+
return success(account, false);
|
|
32
|
+
let client;
|
|
33
|
+
try {
|
|
34
|
+
client = this.createClient(accountSessionPath(this.options.dataDir, account.name));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return failure('account_logout_failed', 'Unable to initialize Telegram logout.');
|
|
38
|
+
}
|
|
39
|
+
let logoutError;
|
|
40
|
+
try {
|
|
41
|
+
await client.logOut();
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
logoutError = error;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
await client.close();
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (logoutError == null)
|
|
51
|
+
logoutError = error;
|
|
52
|
+
}
|
|
53
|
+
if (logoutError != null && !isTerminalSessionError(logoutError)) {
|
|
54
|
+
return failure('account_logout_failed', 'Unable to log out the Telegram account.');
|
|
55
|
+
}
|
|
56
|
+
const updated = { ...account, auth_state: 'logged_out' };
|
|
57
|
+
try {
|
|
58
|
+
this.options.store.write(updateAccount(registry, updated));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return failure('account_store_error', 'Unable to update account authentication state.');
|
|
62
|
+
}
|
|
63
|
+
return success(updated, true);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async login(input) {
|
|
67
|
+
return this.options.store.withLock(async () => {
|
|
68
|
+
const registry = this.options.store.read();
|
|
69
|
+
const account = findAccount(registry, input.name);
|
|
70
|
+
if (!account)
|
|
71
|
+
return accountNotFound(input.name);
|
|
72
|
+
if (account.auth_state === 'authenticated')
|
|
73
|
+
return success(account, false);
|
|
74
|
+
if (input.interactive === false) {
|
|
75
|
+
return failure('interaction_required', 'Account login requires an interactive terminal.');
|
|
76
|
+
}
|
|
77
|
+
const sessionPath = accountSessionPath(this.options.dataDir, account.name);
|
|
78
|
+
let temporaryDir;
|
|
79
|
+
try {
|
|
80
|
+
mkdirSync(dirname(sessionPath), { recursive: true });
|
|
81
|
+
temporaryDir = this.createTemporaryDirectory(join(dirname(sessionPath), '.login-'));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return failure('account_session_replace_failed', 'Unable to create staged account session storage.');
|
|
85
|
+
}
|
|
86
|
+
const stagedSessionPath = join(temporaryDir, 'session');
|
|
87
|
+
const discardedSessionPath = join(temporaryDir, 'discarded-session');
|
|
88
|
+
const tombstonePath = join(dirname(sessionPath), `.session-${randomUUID()}.bak`);
|
|
89
|
+
let preserveTombstone = false;
|
|
90
|
+
let preserveTemporaryDir = false;
|
|
91
|
+
let completedAccount;
|
|
92
|
+
const cleanupRecoveryPaths = [];
|
|
93
|
+
try {
|
|
94
|
+
let authenticated;
|
|
95
|
+
try {
|
|
96
|
+
authenticated = await this.authenticate(stagedSessionPath);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (isCliInterruptedError(error))
|
|
100
|
+
throw error;
|
|
101
|
+
return failure(errorCode(error, 'account_login_failed'), 'Unable to authenticate the Telegram account.');
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
await authenticated.close();
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
preserveTemporaryDir = true;
|
|
108
|
+
return failure('account_login_failed', 'Unable to confirm staged Telegram session shutdown.', { recovery_path: temporaryDir });
|
|
109
|
+
}
|
|
110
|
+
if (authenticated.user.id !== account.user_id) {
|
|
111
|
+
return failure('account_identity_mismatch', `Authenticated Telegram user ${authenticated.user.id} does not match account "${account.name}" (${account.user_id}).`);
|
|
112
|
+
}
|
|
113
|
+
if (!existsSync(stagedSessionPath)) {
|
|
114
|
+
return failure('account_session_replace_failed', 'Authentication did not create a staged session.');
|
|
115
|
+
}
|
|
116
|
+
const hadOriginalSession = existsSync(sessionPath);
|
|
117
|
+
try {
|
|
118
|
+
if (hadOriginalSession)
|
|
119
|
+
this.renamePath(sessionPath, tombstonePath);
|
|
120
|
+
this.renamePath(stagedSessionPath, sessionPath);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (hadOriginalSession && existsSync(tombstonePath)) {
|
|
124
|
+
const restoreError = restoreSession(tombstonePath, sessionPath, this.renamePath);
|
|
125
|
+
if (restoreError) {
|
|
126
|
+
preserveTombstone = true;
|
|
127
|
+
return recoveryFailure('account_session_replace_failed', tombstonePath);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return failure('account_session_replace_failed', 'Unable to replace the Telegram session safely.');
|
|
131
|
+
}
|
|
132
|
+
const updated = { ...account, auth_state: 'authenticated' };
|
|
133
|
+
try {
|
|
134
|
+
this.options.store.write(updateAccount(registry, updated));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
const rollbackError = rollbackInstalledSession({
|
|
138
|
+
discardedSessionPath,
|
|
139
|
+
hadOriginalSession,
|
|
140
|
+
renamePath: this.renamePath,
|
|
141
|
+
sessionPath,
|
|
142
|
+
tombstonePath,
|
|
143
|
+
});
|
|
144
|
+
if (rollbackError) {
|
|
145
|
+
preserveTombstone = hadOriginalSession && existsSync(tombstonePath);
|
|
146
|
+
return preserveTombstone
|
|
147
|
+
? recoveryFailure('account_store_error', tombstonePath)
|
|
148
|
+
: failure('account_store_error', 'Unable to update account authentication state and roll back the staged session.');
|
|
149
|
+
}
|
|
150
|
+
return failure('account_store_error', 'Unable to update account authentication state.');
|
|
151
|
+
}
|
|
152
|
+
completedAccount = updated;
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
if (!preserveTemporaryDir && !safelyRemove(this.removePath, temporaryDir))
|
|
156
|
+
cleanupRecoveryPaths.push(temporaryDir);
|
|
157
|
+
if (!preserveTombstone && !safelyRemove(this.removePath, tombstonePath))
|
|
158
|
+
cleanupRecoveryPaths.push(tombstonePath);
|
|
159
|
+
}
|
|
160
|
+
if (cleanupRecoveryPaths.length > 0) {
|
|
161
|
+
const primaryRecoveryPath = cleanupRecoveryPaths[cleanupRecoveryPaths.length - 1];
|
|
162
|
+
return failure('account_session_cleanup_failed', 'Account login succeeded, but secure session cleanup did not complete.', { recovery_path: primaryRecoveryPath, recovery_paths: cleanupRecoveryPaths });
|
|
163
|
+
}
|
|
164
|
+
return success(completedAccount, true);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function safelyRemove(removePath, path) {
|
|
169
|
+
try {
|
|
170
|
+
removePath(path);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function findAccount(registry, name) {
|
|
178
|
+
return registry.accounts.find((account) => account.name === name);
|
|
179
|
+
}
|
|
180
|
+
function updateAccount(registry, updated) {
|
|
181
|
+
return {
|
|
182
|
+
...registry,
|
|
183
|
+
accounts: registry.accounts.map((account) => account.name === updated.name ? updated : account),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function success(account, changed) {
|
|
187
|
+
return { ok: true, data: { account, changed } };
|
|
188
|
+
}
|
|
189
|
+
function accountNotFound(name) {
|
|
190
|
+
return failure('account_not_found', `Account "${name}" is not registered.`);
|
|
191
|
+
}
|
|
192
|
+
function failure(code, message, details) {
|
|
193
|
+
return { ok: false, error: { code, message, ...(details === undefined ? {} : { details }) } };
|
|
194
|
+
}
|
|
195
|
+
function recoveryFailure(code, recoveryPath) {
|
|
196
|
+
return failure(code, code === 'account_store_error'
|
|
197
|
+
? 'Unable to update account authentication state; the original session requires recovery.'
|
|
198
|
+
: 'Unable to replace the Telegram session; the original session requires recovery.', { recovery_path: recoveryPath });
|
|
199
|
+
}
|
|
200
|
+
function restoreSession(tombstonePath, sessionPath, renamePath) {
|
|
201
|
+
if (existsSync(sessionPath)) {
|
|
202
|
+
return new Error(`Cannot restore original session because destination exists: ${sessionPath}`);
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
renamePath(tombstonePath, sessionPath);
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
return error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function rollbackInstalledSession(options) {
|
|
213
|
+
if (existsSync(options.sessionPath)) {
|
|
214
|
+
try {
|
|
215
|
+
options.renamePath(options.sessionPath, options.discardedSessionPath);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
try {
|
|
219
|
+
rmSync(options.sessionPath, { recursive: true, force: true });
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return new Error('Unable to discard the staged session during rollback.');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (!options.hadOriginalSession || !existsSync(options.tombstonePath))
|
|
227
|
+
return undefined;
|
|
228
|
+
return restoreSession(options.tombstonePath, options.sessionPath, options.renamePath);
|
|
229
|
+
}
|
|
230
|
+
function isTerminalSessionError(error) {
|
|
231
|
+
return error instanceof TelegramSessionTerminatedError;
|
|
232
|
+
}
|
|
233
|
+
function errorCode(error, fallback) {
|
|
234
|
+
if (error !== null && typeof error === 'object' && 'code' in error) {
|
|
235
|
+
const code = error.code;
|
|
236
|
+
if (typeof code === 'string' && code.length > 0)
|
|
237
|
+
return code;
|
|
238
|
+
}
|
|
239
|
+
return fallback;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=account-session-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-session-service.js","sourceRoot":"","sources":["../../src/services/account-session-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,qBAAqB,EAA6B,MAAM,qCAAqC,CAAA;AAEtG,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,8BAA8B,EAA8B,MAAM,sBAAsB,CAAA;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAsB9D,MAAM,OAAO,qBAAqB;IAOH;IANZ,YAAY,CAAgD;IAC5D,YAAY,CAAwD;IACpE,wBAAwB,CAA4B;IACpD,UAAU,CAAwB;IAClC,UAAU,CAA+C;IAE1E,YAA6B,OAAqC;QAArC,YAAO,GAAP,OAAO,CAA8B;QAChE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,oBAAoB,CAAA;QAChE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAAA;QACjE,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,IAAI,WAAW,CAAA;QAC/E,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAClG,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,UAAU,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAA0B;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;YAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACjD,IAAI,CAAC,OAAO;gBAAE,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAChD,IAAI,OAAO,CAAC,UAAU,KAAK,YAAY;gBAAE,OAAO,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAEvE,IAAI,MAA6B,CAAA;YACjC,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;YACpF,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,OAAO,CAAC,uBAAuB,EAAE,uCAAuC,CAAC,CAAA;YAClF,CAAC;YAED,IAAI,WAAoB,CAAA;YACxB,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAA;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,GAAG,KAAK,CAAA;YACrB,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,WAAW,IAAI,IAAI;oBAAE,WAAW,GAAG,KAAK,CAAA;YAC9C,CAAC;YAED,IAAI,WAAW,IAAI,IAAI,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChE,OAAO,OAAO,CAAC,uBAAuB,EAAE,yCAAyC,CAAC,CAAA;YACpF,CAAC;YAED,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,YAAqB,EAAE,CAAA;YACjE,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,OAAO,CAAC,qBAAqB,EAAE,gDAAgD,CAAC,CAAA;YACzF,CAAC;YACD,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA0B;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;YAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACjD,IAAI,CAAC,OAAO;gBAAE,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAChD,IAAI,OAAO,CAAC,UAAU,KAAK,eAAe;gBAAE,OAAO,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC1E,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;gBAChC,OAAO,OAAO,CAAC,sBAAsB,EAAE,iDAAiD,CAAC,CAAA;YAC3F,CAAC;YAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAC1E,IAAI,YAAoB,CAAA;YACxB,IAAI,CAAC;gBACH,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBACpD,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;YACrF,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,OAAO,CAAC,gCAAgC,EAAE,kDAAkD,CAAC,CAAA;YACtG,CAAC;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;YACvD,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAA;YACpE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,YAAY,UAAU,EAAE,MAAM,CAAC,CAAA;YAChF,IAAI,iBAAiB,GAAG,KAAK,CAAA;YAC7B,IAAI,oBAAoB,GAAG,KAAK,CAAA;YAChC,IAAI,gBAAyC,CAAA;YAC7C,MAAM,oBAAoB,GAAa,EAAE,CAAA;YAEzC,IAAI,CAAC;gBACH,IAAI,aAAmC,CAAA;gBACvC,IAAI,CAAC;oBACH,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAA;gBAC5D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,qBAAqB,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAA;oBAC7C,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,sBAAsB,CAAC,EAAE,8CAA8C,CAAC,CAAA;gBAC1G,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAA;gBAC7B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,oBAAoB,GAAG,IAAI,CAAA;oBAC3B,OAAO,OAAO,CAAC,sBAAsB,EAAE,qDAAqD,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAA;gBAChI,CAAC;gBAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC9C,OAAO,OAAO,CACZ,2BAA2B,EAC3B,+BAA+B,aAAa,CAAC,IAAI,CAAC,EAAE,4BAA4B,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,IAAI,CACtH,CAAA;gBACH,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACnC,OAAO,OAAO,CAAC,gCAAgC,EAAE,iDAAiD,CAAC,CAAA;gBACrG,CAAC;gBAED,MAAM,kBAAkB,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;gBAClD,IAAI,CAAC;oBACH,IAAI,kBAAkB;wBAAE,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;oBACnE,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAA;gBACjD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,kBAAkB,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;wBACpD,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;wBAChF,IAAI,YAAY,EAAE,CAAC;4BACjB,iBAAiB,GAAG,IAAI,CAAA;4BACxB,OAAO,eAAe,CAAC,gCAAgC,EAAE,aAAa,CAAC,CAAA;wBACzE,CAAC;oBACH,CAAC;oBACD,OAAO,OAAO,CAAC,gCAAgC,EAAE,gDAAgD,CAAC,CAAA;gBACpG,CAAC;gBAED,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,eAAwB,EAAE,CAAA;gBACpE,IAAI,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;gBAC5D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,aAAa,GAAG,wBAAwB,CAAC;wBAC7C,oBAAoB;wBACpB,kBAAkB;wBAClB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,WAAW;wBACX,aAAa;qBACd,CAAC,CAAA;oBACF,IAAI,aAAa,EAAE,CAAC;wBAClB,iBAAiB,GAAG,kBAAkB,IAAI,UAAU,CAAC,aAAa,CAAC,CAAA;wBACnE,OAAO,iBAAiB;4BACtB,CAAC,CAAC,eAAe,CAAC,qBAAqB,EAAE,aAAa,CAAC;4BACvD,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,iFAAiF,CAAC,CAAA;oBACvH,CAAC;oBACD,OAAO,OAAO,CAAC,qBAAqB,EAAE,gDAAgD,CAAC,CAAA;gBACzF,CAAC;gBAED,gBAAgB,GAAG,OAAO,CAAA;YAC5B,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,oBAAoB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;oBAAE,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;gBAClH,IAAI,CAAC,iBAAiB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC;oBAAE,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YACnH,CAAC;YAED,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;gBAClF,OAAO,OAAO,CACZ,gCAAgC,EAChC,uEAAuE,EACvE,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAC7E,CAAA;YACH,CAAC;YACD,OAAO,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAED,SAAS,YAAY,CAAC,UAAkC,EAAE,IAAY;IACpE,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAyB,EAAE,IAAY;IAC1D,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,aAAa,CAAC,QAAyB,EAAE,OAAoB;IACpE,OAAO;QACL,GAAG,QAAQ;QACX,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;KAChG,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,OAAoB,EAAE,OAAgB;IACrD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAA;AACjD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,OAAO,CAAC,mBAAmB,EAAE,YAAY,IAAI,sBAAsB,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,OAAiB;IAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAA;AAC/F,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,YAAoB;IACzD,OAAO,OAAO,CACZ,IAAI,EACJ,IAAI,KAAK,qBAAqB;QAC5B,CAAC,CAAC,wFAAwF;QAC1F,CAAC,CAAC,iFAAiF,EACrF,EAAE,aAAa,EAAE,YAAY,EAAE,CAChC,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CACrB,aAAqB,EACrB,WAAmB,EACnB,UAAyD;IAEzD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,KAAK,CAAC,+DAA+D,WAAW,EAAE,CAAC,CAAA;IAChG,CAAC;IACD,IAAI,CAAC;QACH,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACtC,OAAO,SAAS,CAAA;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,OAMjC;IACC,IAAI,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC;QAAE,OAAO,SAAS,CAAA;IACvF,OAAO,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;AACvF,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,8BAA8B,CAAA;AACxD,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,QAAgB;IACjD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAA;QAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;IAC9D,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { posix } from 'node:path';
|
|
2
|
+
const MAX_CHAT_SLUG_BYTES = 80;
|
|
3
|
+
const MAX_FILENAME_BYTES = 255;
|
|
4
|
+
const MAX_EXTENSION_BYTES = 32;
|
|
5
|
+
const WINDOWS_RESERVED_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu;
|
|
6
|
+
const graphemeSegmenter = new Intl.Segmenter('und', { granularity: 'grapheme' });
|
|
7
|
+
function sanitizePart(value) {
|
|
8
|
+
return value
|
|
9
|
+
.normalize('NFKC')
|
|
10
|
+
.toLocaleLowerCase('und')
|
|
11
|
+
.replace(/[\p{C}\\/:*?"<>|_\s.]+/gu, '-')
|
|
12
|
+
.replace(/[^\p{L}\p{N}\p{M}-]+/gu, '-')
|
|
13
|
+
.replace(/-+/gu, '-')
|
|
14
|
+
.replace(/^-|-$/gu, '');
|
|
15
|
+
}
|
|
16
|
+
function safeInteger(value, label) {
|
|
17
|
+
if (!Number.isSafeInteger(value)) {
|
|
18
|
+
throw new Error(`archive_invalid_${label}`);
|
|
19
|
+
}
|
|
20
|
+
return String(value);
|
|
21
|
+
}
|
|
22
|
+
function truncateUtf8(value, maxBytes) {
|
|
23
|
+
let result = '';
|
|
24
|
+
let bytes = 0;
|
|
25
|
+
for (const { segment } of graphemeSegmenter.segment(value)) {
|
|
26
|
+
const segmentBytes = Buffer.byteLength(segment);
|
|
27
|
+
if (bytes + segmentBytes > maxBytes)
|
|
28
|
+
break;
|
|
29
|
+
result += segment;
|
|
30
|
+
bytes += segmentBytes;
|
|
31
|
+
}
|
|
32
|
+
return result.replace(/-$/u, '');
|
|
33
|
+
}
|
|
34
|
+
export function archiveChatFile(chatId, title) {
|
|
35
|
+
const id = safeInteger(chatId, 'chat_id');
|
|
36
|
+
const slug = truncateUtf8(sanitizePart(title), MAX_CHAT_SLUG_BYTES) || 'chat';
|
|
37
|
+
return `${id}-${slug}.md`;
|
|
38
|
+
}
|
|
39
|
+
function mediaBasename(filename, messagePrefix) {
|
|
40
|
+
const basename = filename.replace(/\\/gu, '/').split('/').at(-1) ?? '';
|
|
41
|
+
const extensionIndex = basename.lastIndexOf('.');
|
|
42
|
+
const hasExtension = extensionIndex > 0 && extensionIndex < basename.length - 1;
|
|
43
|
+
const rawStem = hasExtension ? basename.slice(0, extensionIndex) : basename;
|
|
44
|
+
const rawExtension = hasExtension ? basename.slice(extensionIndex + 1) : '';
|
|
45
|
+
let stem = sanitizePart(rawStem) || 'file';
|
|
46
|
+
const extension = truncateUtf8(sanitizePart(rawExtension), MAX_EXTENSION_BYTES);
|
|
47
|
+
if (WINDOWS_RESERVED_NAME.test(stem)) {
|
|
48
|
+
stem = `file-${stem}`;
|
|
49
|
+
}
|
|
50
|
+
const reservedBytes = Buffer.byteLength(messagePrefix)
|
|
51
|
+
+ (extension ? Buffer.byteLength(extension) + 1 : 0);
|
|
52
|
+
stem = truncateUtf8(stem, MAX_FILENAME_BYTES - reservedBytes) || 'file';
|
|
53
|
+
return extension ? `${stem}.${extension}` : stem;
|
|
54
|
+
}
|
|
55
|
+
export function archiveMediaFile(chatId, messageId, filename) {
|
|
56
|
+
const chat = safeInteger(chatId, 'chat_id');
|
|
57
|
+
const message = safeInteger(messageId, 'message_id');
|
|
58
|
+
const messagePrefix = `${message}-`;
|
|
59
|
+
return posix.join('media', chat, `${messagePrefix}${mediaBasename(filename, messagePrefix)}`);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=archive-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-layout.js","sourceRoot":"","sources":["../../src/services/archive-layout.ts"],"names":[],"mappings":"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"}
|