paperkite 0.1.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.
Files changed (121) hide show
  1. package/README.md +81 -0
  2. package/data/flows.example.yml +65 -0
  3. package/data/settings.example.yml +13 -0
  4. package/dist/data/hooks/weekend-slot.d.ts +12 -0
  5. package/dist/data/hooks/weekend-slot.js +107 -0
  6. package/dist/data/hooks/weekend-slot.js.map +1 -0
  7. package/dist/packages/account-health/src/index.d.ts +8 -0
  8. package/dist/packages/account-health/src/index.js +37 -0
  9. package/dist/packages/account-health/src/index.js.map +1 -0
  10. package/dist/packages/archive/src/archiver.d.ts +98 -0
  11. package/dist/packages/archive/src/archiver.js +399 -0
  12. package/dist/packages/archive/src/archiver.js.map +1 -0
  13. package/dist/packages/archive/src/config.d.ts +22 -0
  14. package/dist/packages/archive/src/config.js +62 -0
  15. package/dist/packages/archive/src/config.js.map +1 -0
  16. package/dist/packages/archive/src/console/live.d.ts +24 -0
  17. package/dist/packages/archive/src/console/live.js +144 -0
  18. package/dist/packages/archive/src/console/live.js.map +1 -0
  19. package/dist/packages/archive/src/console/media.d.ts +66 -0
  20. package/dist/packages/archive/src/console/media.js +368 -0
  21. package/dist/packages/archive/src/console/media.js.map +1 -0
  22. package/dist/packages/archive/src/console/server.d.ts +12 -0
  23. package/dist/packages/archive/src/console/server.js +583 -0
  24. package/dist/packages/archive/src/console/server.js.map +1 -0
  25. package/dist/packages/archive/src/console/service.d.ts +13 -0
  26. package/dist/packages/archive/src/console/service.js +86 -0
  27. package/dist/packages/archive/src/console/service.js.map +1 -0
  28. package/dist/packages/archive/src/storage/index.d.ts +6 -0
  29. package/dist/packages/archive/src/storage/index.js +23 -0
  30. package/dist/packages/archive/src/storage/index.js.map +1 -0
  31. package/dist/packages/archive/src/storage/model.d.ts +296 -0
  32. package/dist/packages/archive/src/storage/model.js +151 -0
  33. package/dist/packages/archive/src/storage/model.js.map +1 -0
  34. package/dist/packages/archive/src/storage/postgres.d.ts +67 -0
  35. package/dist/packages/archive/src/storage/postgres.js +1021 -0
  36. package/dist/packages/archive/src/storage/postgres.js.map +1 -0
  37. package/dist/packages/archive/src/storage/sqlite.d.ts +59 -0
  38. package/dist/packages/archive/src/storage/sqlite.js +981 -0
  39. package/dist/packages/archive/src/storage/sqlite.js.map +1 -0
  40. package/dist/packages/notify-bark/src/index.d.ts +33 -0
  41. package/dist/packages/notify-bark/src/index.js +96 -0
  42. package/dist/packages/notify-bark/src/index.js.map +1 -0
  43. package/dist/packages/runtime-console/src/console/errors.d.ts +5 -0
  44. package/dist/packages/runtime-console/src/console/errors.js +11 -0
  45. package/dist/packages/runtime-console/src/console/errors.js.map +1 -0
  46. package/dist/packages/runtime-console/src/console/logs.d.ts +1 -0
  47. package/dist/packages/runtime-console/src/console/logs.js +27 -0
  48. package/dist/packages/runtime-console/src/console/logs.js.map +1 -0
  49. package/dist/packages/runtime-console/src/console/server.d.ts +6 -0
  50. package/dist/packages/runtime-console/src/console/server.js +182 -0
  51. package/dist/packages/runtime-console/src/console/server.js.map +1 -0
  52. package/dist/packages/runtime-console/src/index.d.ts +10 -0
  53. package/dist/packages/runtime-console/src/index.js +83 -0
  54. package/dist/packages/runtime-console/src/index.js.map +1 -0
  55. package/dist/src/app.d.ts +15 -0
  56. package/dist/src/app.js +34 -0
  57. package/dist/src/app.js.map +1 -0
  58. package/dist/src/cli.d.ts +2 -0
  59. package/dist/src/cli.js +250 -0
  60. package/dist/src/cli.js.map +1 -0
  61. package/dist/src/config/editor.d.ts +2 -0
  62. package/dist/src/config/editor.js +19 -0
  63. package/dist/src/config/editor.js.map +1 -0
  64. package/dist/src/config/loader.d.ts +6 -0
  65. package/dist/src/config/loader.js +188 -0
  66. package/dist/src/config/loader.js.map +1 -0
  67. package/dist/src/config/model.d.ts +71 -0
  68. package/dist/src/config/model.js +97 -0
  69. package/dist/src/config/model.js.map +1 -0
  70. package/dist/src/config/paths.d.ts +3 -0
  71. package/dist/src/config/paths.js +12 -0
  72. package/dist/src/config/paths.js.map +1 -0
  73. package/dist/src/config/settings.d.ts +19 -0
  74. package/dist/src/config/settings.js +44 -0
  75. package/dist/src/config/settings.js.map +1 -0
  76. package/dist/src/control/process-lock.d.ts +4 -0
  77. package/dist/src/control/process-lock.js +57 -0
  78. package/dist/src/control/process-lock.js.map +1 -0
  79. package/dist/src/control/socket.d.ts +14 -0
  80. package/dist/src/control/socket.js +131 -0
  81. package/dist/src/control/socket.js.map +1 -0
  82. package/dist/src/engine/hooks.d.ts +4 -0
  83. package/dist/src/engine/hooks.js +38 -0
  84. package/dist/src/engine/hooks.js.map +1 -0
  85. package/dist/src/engine/logger.d.ts +17 -0
  86. package/dist/src/engine/logger.js +78 -0
  87. package/dist/src/engine/logger.js.map +1 -0
  88. package/dist/src/engine/runtime.d.ts +78 -0
  89. package/dist/src/engine/runtime.js +799 -0
  90. package/dist/src/engine/runtime.js.map +1 -0
  91. package/dist/src/engine/scheduler.d.ts +9 -0
  92. package/dist/src/engine/scheduler.js +58 -0
  93. package/dist/src/engine/scheduler.js.map +1 -0
  94. package/dist/src/extensions/loader.d.ts +11 -0
  95. package/dist/src/extensions/loader.js +202 -0
  96. package/dist/src/extensions/loader.js.map +1 -0
  97. package/dist/src/extensions/manager.d.ts +1 -0
  98. package/dist/src/extensions/manager.js +121 -0
  99. package/dist/src/extensions/manager.js.map +1 -0
  100. package/dist/src/extensions/profile.d.ts +14 -0
  101. package/dist/src/extensions/profile.js +57 -0
  102. package/dist/src/extensions/profile.js.map +1 -0
  103. package/dist/src/extensions/registry.d.ts +19 -0
  104. package/dist/src/extensions/registry.js +62 -0
  105. package/dist/src/extensions/registry.js.map +1 -0
  106. package/dist/src/telegram/client.d.ts +20 -0
  107. package/dist/src/telegram/client.js +54 -0
  108. package/dist/src/telegram/client.js.map +1 -0
  109. package/dist/src/telegram/failure.d.ts +2 -0
  110. package/dist/src/telegram/failure.js +98 -0
  111. package/dist/src/telegram/failure.js.map +1 -0
  112. package/dist/src/telegram/login.d.ts +1 -0
  113. package/dist/src/telegram/login.js +31 -0
  114. package/dist/src/telegram/login.js.map +1 -0
  115. package/dist/src/telegram/pool.d.ts +47 -0
  116. package/dist/src/telegram/pool.js +300 -0
  117. package/dist/src/telegram/pool.js.map +1 -0
  118. package/dist/src/telegram/session-files.d.ts +4 -0
  119. package/dist/src/telegram/session-files.js +34 -0
  120. package/dist/src/telegram/session-files.js.map +1 -0
  121. package/package.json +62 -0
@@ -0,0 +1,399 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ const DAY_MS = 86_400_000;
4
+ const EPOCH_ISO = new Date(0).toISOString();
5
+ export class MessageArchiver {
6
+ deps;
7
+ constructor(deps) {
8
+ this.deps = deps;
9
+ }
10
+ async findChat(identifier) {
11
+ try {
12
+ const entity = await this.deps.submit((client) => this.resolveEntity(client, identifier));
13
+ if (!entity) {
14
+ this.deps.logger.info("chat not found: " + identifier);
15
+ return undefined;
16
+ }
17
+ return toChatInfo(entity, this.deps.chatIdOf);
18
+ }
19
+ catch (error) {
20
+ this.deps.logger.warn("failed to resolve chat " + identifier, error);
21
+ return undefined;
22
+ }
23
+ }
24
+ async saveChatMessages(chatIdentifier, options = {}) {
25
+ const chatInfo = await this.findChat(chatIdentifier);
26
+ if (!chatInfo)
27
+ return { messages: 0, media: 0, skipped: 0 };
28
+ await this.deps.store.saveChat(withHandleFallback(chatInfo, chatIdentifier));
29
+ const daysBack = options.daysBack ?? 30;
30
+ const maxMessages = options.maxMessages ?? 1_000;
31
+ const endDate = new Date();
32
+ const window = await this.planSyncWindow(chatInfo.chatId, daysBack, maxMessages, options.resume ?? true, endDate);
33
+ const sessionId = await this.deps.store.startSyncSession(chatInfo.chatId, window.startDate?.toISOString() ?? EPOCH_ISO, endDate.toISOString());
34
+ const counts = { messages: 0, media: 0, skipped: 0, processed: 0 };
35
+ try {
36
+ await this.runSyncWindow(chatInfo, chatIdentifier, window, counts, options.downloadMedia ?? this.deps.downloadMedia);
37
+ await this.deps.store.completeSyncSession(sessionId, counts.messages, counts.media);
38
+ this.deps.logger.info("sync done for " + chatIdentifier +
39
+ `: processed=${counts.processed} new=${counts.messages} skipped=${counts.skipped} media=${counts.media}`);
40
+ return asResult(counts);
41
+ }
42
+ catch (error) {
43
+ await this.deps.store.completeSyncSession(sessionId, counts.messages, counts.media);
44
+ this.deps.logger.warn("sync failed for " + chatIdentifier, error);
45
+ return asResult(counts);
46
+ }
47
+ }
48
+ async resolveEntity(client, identifier) {
49
+ if (typeof identifier === "number")
50
+ return client.getEntity(identifier);
51
+ let name = String(identifier).trim();
52
+ if (/^https?:\/\//i.test(name)) {
53
+ const last = name.replace(/\/+$/, "").split("/").pop();
54
+ if (last)
55
+ name = `@${last.replace(/^@/, "")}`;
56
+ }
57
+ if (name.startsWith("@"))
58
+ return client.getEntity(name);
59
+ const needle = name.toLowerCase();
60
+ for await (const dialog of client.iterDialogs()) {
61
+ const title = dialog.title ?? "";
62
+ const username = entityUsername(dialog.entity) ?? "";
63
+ if (title.toLowerCase().includes(needle) || username.toLowerCase() === needle) {
64
+ return dialog.entity ?? client.getEntity(name);
65
+ }
66
+ }
67
+ return undefined;
68
+ }
69
+ async planSyncWindow(chatId, daysBack, maxMessages, resume, endDate) {
70
+ const startDate = daysBack === 0 ? undefined : new Date(endDate.getTime() - daysBack * DAY_MS);
71
+ let max = maxMessages === 0 ? undefined : maxMessages;
72
+ if (startDate === undefined && max === undefined) {
73
+ throw new Error("days_back and max_messages cannot both be unlimited");
74
+ }
75
+ let incremental = false;
76
+ let lastMessageInfo;
77
+ let resumeStartDate = startDate;
78
+ if (resume) {
79
+ lastMessageInfo = await this.deps.store.getLastMessageInfo(chatId);
80
+ if (lastMessageInfo) {
81
+ incremental = true;
82
+ const lastDate = new Date(lastMessageInfo.date);
83
+ resumeStartDate = startDate ? (lastDate > startDate ? lastDate : startDate) : lastDate;
84
+ if (max !== undefined)
85
+ max = Math.min(max, 1_000);
86
+ this.deps.logger.info("incremental sync for " + chatId + " from " + resumeStartDate.toISOString());
87
+ }
88
+ else {
89
+ this.deps.logger.info("full sync for " + chatId);
90
+ }
91
+ }
92
+ else {
93
+ this.deps.logger.info("full re-sync for " + chatId + " (resume disabled)");
94
+ }
95
+ return { startDate, maxMessages: max, incremental, lastMessageInfo, resumeStartDate };
96
+ }
97
+ async runSyncWindow(chatInfo, chatIdentifier, window, counts, downloadMedia) {
98
+ const budget = { remaining: window.maxMessages };
99
+ const minDate = window.incremental ? window.resumeStartDate : window.startDate;
100
+ const anchorId = window.incremental ? window.lastMessageInfo?.messageId : undefined;
101
+ await this.sweep(chatInfo, String(chatIdentifier), minDate, anchorId, budget, counts, downloadMedia);
102
+ }
103
+ async sweep(chatInfo, chatLabel, minDate, stopAnchorId, budget, counts, downloadMedia) {
104
+ const chatId = chatInfo.chatId;
105
+ let nextMaxId;
106
+ while (!this.deps.shouldStop() && !budgetExhausted(budget)) {
107
+ let pageLimit = this.deps.batchSize;
108
+ if (budget.remaining !== undefined)
109
+ pageLimit = Math.min(pageLimit, budget.remaining);
110
+ const page = await this.deps.submit((client) => this.fetchPageOnHost(client, chatId, chatInfo, minDate, nextMaxId, pageLimit, stopAnchorId));
111
+ counts.processed += page.rows.length;
112
+ const consumed = await this.commitPage(chatId, chatLabel, page, counts, downloadMedia);
113
+ if (budget.remaining !== undefined)
114
+ budget.remaining -= consumed;
115
+ if (page.rows.length === 0 || page.reachedBottom)
116
+ break;
117
+ if (stopAnchorId !== undefined && page.reachedAnchor)
118
+ break;
119
+ if (page.minMessageId === undefined || page.minMessageId <= 1)
120
+ break;
121
+ nextMaxId = page.minMessageId;
122
+ }
123
+ }
124
+ async fetchPageOnHost(client, chatId, chatInfo, minDate, maxId, limit, stopAnchorId) {
125
+ const rows = [];
126
+ let minMessageId;
127
+ let reachedAnchor = false;
128
+ let reachedBottom = false;
129
+ for await (const message of client.iterMessages(chatId, { limit, maxId: maxId ?? 0 })) {
130
+ const date = new Date(Number(message.date) * 1_000);
131
+ if (minDate !== undefined && date < minDate) {
132
+ reachedBottom = true;
133
+ break;
134
+ }
135
+ if (stopAnchorId !== undefined && message.id <= stopAnchorId)
136
+ reachedAnchor = true;
137
+ rows.push(extractMessageRow(message, chatInfo));
138
+ if (minMessageId === undefined || message.id < minMessageId)
139
+ minMessageId = message.id;
140
+ if (reachedAnchor || reachedBottom)
141
+ break;
142
+ }
143
+ return { rows, minMessageId, reachedAnchor, reachedBottom };
144
+ }
145
+ async commitPage(chatId, chatLabel, page, counts, downloadMedia) {
146
+ if (page.rows.length === 0)
147
+ return 0;
148
+ const ids = page.rows.map((row) => row.messageId);
149
+ const existing = await this.deps.store.messageIdsExist(chatId, ids);
150
+ const newRows = page.rows.filter((row) => !existing.has(row.messageId));
151
+ counts.skipped += page.rows.length - newRows.length;
152
+ let inserted = 0;
153
+ let savedMedia = 0;
154
+ if (newRows.length) {
155
+ const mediaRows = downloadMedia ? await this.downloadNewMedia(chatId, newRows) : [];
156
+ const committed = await this.deps.store.saveBatch(withMediaPaths(newRows, mediaRows), mediaRows);
157
+ inserted = committed.messages;
158
+ savedMedia = committed.media;
159
+ counts.messages += inserted;
160
+ counts.media += savedMedia;
161
+ }
162
+ this.deps.logger.info(`batch committed for ${chatLabel}: fetched=${page.rows.length} new=${inserted} ` +
163
+ `skipped=${page.rows.length - newRows.length} media=${savedMedia} (total new=${counts.messages})`);
164
+ return page.rows.length;
165
+ }
166
+ async downloadNewMedia(chatId, newRows) {
167
+ const targets = newRows
168
+ .filter((row) => row.hasMedia)
169
+ .map((row) => ({ messageId: row.messageId, mediaType: row.mediaType ?? "document" }));
170
+ if (!targets.length)
171
+ return [];
172
+ const chatDir = join(this.deps.mediaDir, `chat_${chatId}`);
173
+ await mkdir(chatDir, { recursive: true });
174
+ const ids = targets.map((target) => target.messageId);
175
+ const downloaded = await this.deps.submit((client) => this.downloadMediaOnHost(client, chatId, chatDir, ids));
176
+ const byId = new Map(downloaded.map((item) => [item.messageId, item]));
177
+ const mediaRows = [];
178
+ for (const target of targets) {
179
+ const item = byId.get(target.messageId);
180
+ if (!item)
181
+ continue;
182
+ mediaRows.push({
183
+ messageId: target.messageId,
184
+ chatId,
185
+ mediaType: target.mediaType,
186
+ fileName: item.fileName,
187
+ filePath: item.filePath,
188
+ fileSize: item.fileSize,
189
+ mimeType: item.mimeType
190
+ });
191
+ }
192
+ return mediaRows;
193
+ }
194
+ async downloadMediaOnHost(client, chatId, chatDir, messageIds) {
195
+ const messages = (await client.getMessages(chatId, { ids: messageIds }))
196
+ .filter((message) => message !== undefined);
197
+ const results = [];
198
+ for (const message of messages) {
199
+ if (!message.media)
200
+ continue;
201
+ try {
202
+ const document = recordOf(documentOf(message.media));
203
+ const ext = photoOf(message.media) ? "jpg" : documentExtension(document) ?? "bin";
204
+ const filePath = await client.downloadMedia(message, { outputFile: join(chatDir, `msg_${message.id}.${ext}`) });
205
+ if (!filePath)
206
+ continue;
207
+ results.push({
208
+ messageId: message.id,
209
+ fileName: basename(String(filePath)),
210
+ filePath: String(filePath),
211
+ fileSize: optionalNumber(document?.size),
212
+ mimeType: optionalText(document?.mimeType)
213
+ });
214
+ }
215
+ catch (error) {
216
+ this.deps.logger.warn("failed to download media for message " + message.id, error);
217
+ }
218
+ }
219
+ return results;
220
+ }
221
+ }
222
+ function extractMessageRow(message, chatInfo) {
223
+ const media = describeMedia(message.media);
224
+ const forward = message.forward ?? message.fwdFrom;
225
+ const forwardFromId = forward !== undefined && forward !== null ? peerIdValue(forward.fromId) : undefined;
226
+ const forwardFromName = forward !== undefined && forward !== null ? optionalText(forward.fromName) : undefined;
227
+ const groupedId = message.groupedId !== undefined && message.groupedId !== null
228
+ ? String(message.groupedId)
229
+ : undefined;
230
+ const sender = message.sender;
231
+ return {
232
+ messageId: message.id,
233
+ chatId: chatInfo.chatId,
234
+ ...(chatInfo.title !== undefined ? { chatTitle: chatInfo.title } : {}),
235
+ senderId: optionalString(message.senderId),
236
+ senderUsername: entityUsername(sender),
237
+ senderFirstName: entityFirstName(sender),
238
+ senderLastName: entityLastName(sender),
239
+ date: new Date(Number(message.date) * 1_000).toISOString(),
240
+ text: message.rawText ?? message.message ?? "",
241
+ entities: normalizeEntities(message.entities),
242
+ messageType: media.messageType,
243
+ replyToMessageId: message.replyToMessageId ?? message.replyTo?.replyToMessageId,
244
+ hasMedia: message.media !== undefined && message.media !== null,
245
+ mediaType: media.mediaType,
246
+ ...(groupedId !== undefined ? { groupedId } : {}),
247
+ ...(forwardFromId !== undefined ? { forwardFromId, forwardFromName } : {})
248
+ };
249
+ }
250
+ /** 消息实体归一化:与 Telegram 原生对齐(offset/length 为 UTF-16 码元),链接实体保留目标 URL。 */
251
+ export function normalizeEntities(entities) {
252
+ if (!entities?.length)
253
+ return [];
254
+ const normalized = [];
255
+ for (const entity of entities) {
256
+ const record = recordOf(entity) ?? {};
257
+ const offset = Number(record.offset ?? 0);
258
+ const length = Number(record.length ?? 0);
259
+ if (!(length > 0))
260
+ continue;
261
+ const url = optionalText(record.url);
262
+ normalized.push(url === undefined
263
+ ? { className: String(record.className ?? ""), offset, length }
264
+ : { className: String(record.className ?? ""), offset, length, url });
265
+ }
266
+ return normalized;
267
+ }
268
+ function describeMedia(media) {
269
+ if (!media)
270
+ return { messageType: "text" };
271
+ if (photoOf(media))
272
+ return { messageType: "photo", mediaType: "photo", mimeType: "image/jpeg" };
273
+ if (className(media) === "MessageMediaDocument") {
274
+ const document = recordOf(documentOf(media) ?? media);
275
+ const attributes = Array.isArray(document?.attributes) ? document.attributes : [];
276
+ const mimeType = optionalText(document?.mimeType);
277
+ if (attributes.some(hasName("DocumentAttributeSticker"))) {
278
+ return { messageType: "sticker", mediaType: "sticker", mimeType: mimeType ?? "image/webp" };
279
+ }
280
+ if (attributes.some(hasName("DocumentAttributeAnimated"))) {
281
+ return { messageType: "animation", mediaType: "animation", mimeType };
282
+ }
283
+ if (attributes.some(hasName("DocumentAttributeVideo"))) {
284
+ return { messageType: "video", mediaType: "video", mimeType };
285
+ }
286
+ return { messageType: "document", mediaType: "document", mimeType };
287
+ }
288
+ return { messageType: "text" };
289
+ }
290
+ function documentExtension(document) {
291
+ const record = recordOf(document);
292
+ const attributes = Array.isArray(record?.attributes) ? record.attributes : [];
293
+ for (const attribute of attributes) {
294
+ if (!hasName("DocumentAttributeFilename")(attribute))
295
+ continue;
296
+ const fileName = optionalText(recordOf(attribute)?.fileName);
297
+ if (fileName) {
298
+ const dot = fileName.lastIndexOf(".");
299
+ if (dot >= 0 && dot < fileName.length - 1)
300
+ return fileName.slice(dot + 1).toLowerCase();
301
+ }
302
+ }
303
+ const mimeType = optionalText(record?.mimeType);
304
+ const mimeExt = mimeType?.split("/")[1];
305
+ return mimeExt && /^[a-z0-9]+$/.test(mimeExt) ? mimeExt : undefined;
306
+ }
307
+ function entityUsername(entity) {
308
+ return optionalText(recordOf(entity)?.username);
309
+ }
310
+ /** 实体未带公开用户名时,用配置中的句柄兜底,便于控制台按用户名解析实体。 */
311
+ function withHandleFallback(chat, identifier) {
312
+ if (chat.username || typeof identifier !== "string")
313
+ return chat;
314
+ const handle = String(identifier).trim().replace(/^@/, "");
315
+ if (!/^[a-zA-Z][a-zA-Z0-9_]{2,31}$/.test(handle))
316
+ return chat;
317
+ return { ...chat, username: handle };
318
+ }
319
+ function entityFirstName(entity) {
320
+ return optionalText(recordOf(entity)?.firstName);
321
+ }
322
+ function entityLastName(entity) {
323
+ return optionalText(recordOf(entity)?.lastName);
324
+ }
325
+ function peerIdValue(peer) {
326
+ const record = recordOf(peer);
327
+ if (!record)
328
+ return undefined;
329
+ for (const key of ["userId", "channelId", "chatId"]) {
330
+ if (record[key] !== undefined && record[key] !== null)
331
+ return String(record[key]);
332
+ }
333
+ return undefined;
334
+ }
335
+ function toChatInfo(entity, chatIdOf) {
336
+ const record = recordOf(entity) ?? {};
337
+ const firstName = optionalText(record.firstName);
338
+ const lastName = optionalText(record.lastName);
339
+ const title = optionalText(record.title) ?? [firstName, lastName].filter(Boolean).join(" ") ?? "Unknown";
340
+ return {
341
+ chatId: chatIdOf(entity),
342
+ title,
343
+ username: optionalText(record.username),
344
+ type: className(entity) === "Channel" ? "channel" : className(entity) === "Chat" ? "group" : "user",
345
+ description: optionalText(record.about),
346
+ membersCount: optionalNumber(record.participantsCount)
347
+ };
348
+ }
349
+ function asResult(counts) {
350
+ return { messages: counts.messages, media: counts.media, skipped: counts.skipped };
351
+ }
352
+ function budgetExhausted(budget) {
353
+ return budget.remaining !== undefined && budget.remaining <= 0;
354
+ }
355
+ function withMediaPaths(rows, mediaRows) {
356
+ const paths = new Map(mediaRows.map((row) => [row.messageId, row.filePath]));
357
+ return rows.map((row) => {
358
+ const mediaFilePath = paths.get(row.messageId);
359
+ return mediaFilePath !== undefined ? { ...row, mediaFilePath } : row;
360
+ });
361
+ }
362
+ function photoOf(media) {
363
+ return className(media) === "MessageMediaPhoto";
364
+ }
365
+ function documentOf(media) {
366
+ return className(media) === "MessageMediaDocument" ? recordOf(media)?.document : undefined;
367
+ }
368
+ function className(value) {
369
+ if (value === null || value === undefined)
370
+ return "";
371
+ const record = recordOf(value);
372
+ if (record && typeof record.className === "string" && record.className)
373
+ return record.className;
374
+ const constructor = value.constructor;
375
+ return constructor?.name ?? "";
376
+ }
377
+ function recordOf(value) {
378
+ return typeof value === "object" && value !== null ? value : undefined;
379
+ }
380
+ function hasName(name) {
381
+ return (value) => className(value) === name;
382
+ }
383
+ function optionalText(value) {
384
+ if (value === undefined || value === null)
385
+ return undefined;
386
+ const text = String(value).trim();
387
+ return text || undefined;
388
+ }
389
+ function optionalNumber(value) {
390
+ if (value === undefined || value === null || value === "")
391
+ return undefined;
392
+ return Number(value);
393
+ }
394
+ function optionalString(value) {
395
+ if (value === undefined || value === null)
396
+ return undefined;
397
+ return String(value);
398
+ }
399
+ //# sourceMappingURL=archiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archiver.js","sourceRoot":"","sources":["../../../../packages/archive/src/archiver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface ArchiveTarget {
2
+ readonly chat: string | number;
3
+ readonly daysBack: number;
4
+ readonly maxMessages: number;
5
+ readonly downloadMedia: boolean;
6
+ readonly resume: boolean;
7
+ }
8
+ export interface ArchiveConfig {
9
+ readonly url?: string;
10
+ readonly schema?: string;
11
+ readonly chats?: unknown;
12
+ readonly chat?: string | number;
13
+ readonly daysBack?: number;
14
+ readonly maxMessages?: number;
15
+ readonly downloadMedia?: boolean;
16
+ readonly resume?: boolean;
17
+ readonly batchSize?: number;
18
+ readonly mediaDir?: string;
19
+ }
20
+ export declare function buildTargets(config: ArchiveConfig): ArchiveTarget[];
21
+ export declare function coerceInt(value: unknown, fallback: number): number;
22
+ export declare function coerceBool(value: unknown, fallback: boolean): boolean;
@@ -0,0 +1,62 @@
1
+ export function buildTargets(config) {
2
+ const defaultDaysBack = coerceInt(config.daysBack, 30);
3
+ const defaultMaxMessages = coerceInt(config.maxMessages, 1_000);
4
+ const defaultDownloadMedia = coerceBool(config.downloadMedia, true);
5
+ const defaultResume = coerceBool(config.resume, true);
6
+ const targets = [];
7
+ const addTarget = (source) => {
8
+ let identifier;
9
+ const overrides = isRecord(source) ? source : undefined;
10
+ if (typeof source === "string" || typeof source === "number") {
11
+ identifier = source;
12
+ }
13
+ else if (overrides) {
14
+ const raw = overrides.chat;
15
+ if (typeof raw === "string" || typeof raw === "number")
16
+ identifier = raw;
17
+ }
18
+ if (identifier === undefined || identifier === "") {
19
+ throw new Error("chats entry needs chat");
20
+ }
21
+ targets.push({
22
+ chat: identifier,
23
+ daysBack: coerceInt(overrides?.daysBack, defaultDaysBack),
24
+ maxMessages: coerceInt(overrides?.maxMessages, defaultMaxMessages),
25
+ downloadMedia: coerceBool(overrides?.downloadMedia, defaultDownloadMedia),
26
+ resume: coerceBool(overrides?.resume, defaultResume)
27
+ });
28
+ };
29
+ if (Array.isArray(config.chats)) {
30
+ for (const item of config.chats)
31
+ addTarget(item);
32
+ }
33
+ else if (config.chats) {
34
+ addTarget(config.chats);
35
+ }
36
+ return targets;
37
+ }
38
+ export function coerceInt(value, fallback) {
39
+ if (value === undefined || value === null || value === "")
40
+ return fallback;
41
+ const result = Number(value);
42
+ if (!Number.isFinite(result))
43
+ throw new Error(`invalid integer: ${String(value)}`);
44
+ return result;
45
+ }
46
+ export function coerceBool(value, fallback) {
47
+ if (typeof value === "boolean")
48
+ return value;
49
+ if (value === undefined || value === null)
50
+ return fallback;
51
+ if (typeof value === "string") {
52
+ const text = value.trim().toLowerCase();
53
+ if (["false", "no", "off", "0", ""].includes(text))
54
+ return false;
55
+ return true;
56
+ }
57
+ return Boolean(value);
58
+ }
59
+ function isRecord(value) {
60
+ return typeof value === "object" && value !== null && !Array.isArray(value);
61
+ }
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../packages/archive/src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Readable } from "node:stream";
2
+ import type { FastifyReply, FastifyRequest } from "fastify";
3
+ import type { RuntimeLogger, SessionAccess } from "@paperkite/sdk";
4
+ import type { StoredMediaFile } from "../storage/index.js";
5
+ export declare class LiveMediaError extends Error {
6
+ readonly status: number;
7
+ constructor(status: number, message: string);
8
+ }
9
+ export interface LiveMediaStreamOptions {
10
+ readonly sessions: SessionAccess;
11
+ readonly logger: RuntimeLogger;
12
+ }
13
+ /**
14
+ * 在线媒体直通:一次请求独立从 Telegram 取对应字节区间并转发给响应,
15
+ * 逐块取用、即时释放会话,播放器的尾部元数据或拖动请求可随时插队。
16
+ */
17
+ export declare class LiveMediaStreamer {
18
+ private readonly deps;
19
+ constructor(deps: LiveMediaStreamOptions);
20
+ serve(request: FastifyRequest, reply: FastifyReply, file: StoredMediaFile, chatUsername: string | undefined, download: boolean): Promise<Readable | undefined>;
21
+ private pump;
22
+ private fetchPart;
23
+ private resolveMedia;
24
+ }