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.
- package/README.md +81 -0
- package/data/flows.example.yml +65 -0
- package/data/settings.example.yml +13 -0
- package/dist/data/hooks/weekend-slot.d.ts +12 -0
- package/dist/data/hooks/weekend-slot.js +107 -0
- package/dist/data/hooks/weekend-slot.js.map +1 -0
- package/dist/packages/account-health/src/index.d.ts +8 -0
- package/dist/packages/account-health/src/index.js +37 -0
- package/dist/packages/account-health/src/index.js.map +1 -0
- package/dist/packages/archive/src/archiver.d.ts +98 -0
- package/dist/packages/archive/src/archiver.js +399 -0
- package/dist/packages/archive/src/archiver.js.map +1 -0
- package/dist/packages/archive/src/config.d.ts +22 -0
- package/dist/packages/archive/src/config.js +62 -0
- package/dist/packages/archive/src/config.js.map +1 -0
- package/dist/packages/archive/src/console/live.d.ts +24 -0
- package/dist/packages/archive/src/console/live.js +144 -0
- package/dist/packages/archive/src/console/live.js.map +1 -0
- package/dist/packages/archive/src/console/media.d.ts +66 -0
- package/dist/packages/archive/src/console/media.js +368 -0
- package/dist/packages/archive/src/console/media.js.map +1 -0
- package/dist/packages/archive/src/console/server.d.ts +12 -0
- package/dist/packages/archive/src/console/server.js +583 -0
- package/dist/packages/archive/src/console/server.js.map +1 -0
- package/dist/packages/archive/src/console/service.d.ts +13 -0
- package/dist/packages/archive/src/console/service.js +86 -0
- package/dist/packages/archive/src/console/service.js.map +1 -0
- package/dist/packages/archive/src/storage/index.d.ts +6 -0
- package/dist/packages/archive/src/storage/index.js +23 -0
- package/dist/packages/archive/src/storage/index.js.map +1 -0
- package/dist/packages/archive/src/storage/model.d.ts +296 -0
- package/dist/packages/archive/src/storage/model.js +151 -0
- package/dist/packages/archive/src/storage/model.js.map +1 -0
- package/dist/packages/archive/src/storage/postgres.d.ts +67 -0
- package/dist/packages/archive/src/storage/postgres.js +1021 -0
- package/dist/packages/archive/src/storage/postgres.js.map +1 -0
- package/dist/packages/archive/src/storage/sqlite.d.ts +59 -0
- package/dist/packages/archive/src/storage/sqlite.js +981 -0
- package/dist/packages/archive/src/storage/sqlite.js.map +1 -0
- package/dist/packages/notify-bark/src/index.d.ts +33 -0
- package/dist/packages/notify-bark/src/index.js +96 -0
- package/dist/packages/notify-bark/src/index.js.map +1 -0
- package/dist/packages/runtime-console/src/console/errors.d.ts +5 -0
- package/dist/packages/runtime-console/src/console/errors.js +11 -0
- package/dist/packages/runtime-console/src/console/errors.js.map +1 -0
- package/dist/packages/runtime-console/src/console/logs.d.ts +1 -0
- package/dist/packages/runtime-console/src/console/logs.js +27 -0
- package/dist/packages/runtime-console/src/console/logs.js.map +1 -0
- package/dist/packages/runtime-console/src/console/server.d.ts +6 -0
- package/dist/packages/runtime-console/src/console/server.js +182 -0
- package/dist/packages/runtime-console/src/console/server.js.map +1 -0
- package/dist/packages/runtime-console/src/index.d.ts +10 -0
- package/dist/packages/runtime-console/src/index.js +83 -0
- package/dist/packages/runtime-console/src/index.js.map +1 -0
- package/dist/src/app.d.ts +15 -0
- package/dist/src/app.js +34 -0
- package/dist/src/app.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +250 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config/editor.d.ts +2 -0
- package/dist/src/config/editor.js +19 -0
- package/dist/src/config/editor.js.map +1 -0
- package/dist/src/config/loader.d.ts +6 -0
- package/dist/src/config/loader.js +188 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/model.d.ts +71 -0
- package/dist/src/config/model.js +97 -0
- package/dist/src/config/model.js.map +1 -0
- package/dist/src/config/paths.d.ts +3 -0
- package/dist/src/config/paths.js +12 -0
- package/dist/src/config/paths.js.map +1 -0
- package/dist/src/config/settings.d.ts +19 -0
- package/dist/src/config/settings.js +44 -0
- package/dist/src/config/settings.js.map +1 -0
- package/dist/src/control/process-lock.d.ts +4 -0
- package/dist/src/control/process-lock.js +57 -0
- package/dist/src/control/process-lock.js.map +1 -0
- package/dist/src/control/socket.d.ts +14 -0
- package/dist/src/control/socket.js +131 -0
- package/dist/src/control/socket.js.map +1 -0
- package/dist/src/engine/hooks.d.ts +4 -0
- package/dist/src/engine/hooks.js +38 -0
- package/dist/src/engine/hooks.js.map +1 -0
- package/dist/src/engine/logger.d.ts +17 -0
- package/dist/src/engine/logger.js +78 -0
- package/dist/src/engine/logger.js.map +1 -0
- package/dist/src/engine/runtime.d.ts +78 -0
- package/dist/src/engine/runtime.js +799 -0
- package/dist/src/engine/runtime.js.map +1 -0
- package/dist/src/engine/scheduler.d.ts +9 -0
- package/dist/src/engine/scheduler.js +58 -0
- package/dist/src/engine/scheduler.js.map +1 -0
- package/dist/src/extensions/loader.d.ts +11 -0
- package/dist/src/extensions/loader.js +202 -0
- package/dist/src/extensions/loader.js.map +1 -0
- package/dist/src/extensions/manager.d.ts +1 -0
- package/dist/src/extensions/manager.js +121 -0
- package/dist/src/extensions/manager.js.map +1 -0
- package/dist/src/extensions/profile.d.ts +14 -0
- package/dist/src/extensions/profile.js +57 -0
- package/dist/src/extensions/profile.js.map +1 -0
- package/dist/src/extensions/registry.d.ts +19 -0
- package/dist/src/extensions/registry.js +62 -0
- package/dist/src/extensions/registry.js.map +1 -0
- package/dist/src/telegram/client.d.ts +20 -0
- package/dist/src/telegram/client.js +54 -0
- package/dist/src/telegram/client.js.map +1 -0
- package/dist/src/telegram/failure.d.ts +2 -0
- package/dist/src/telegram/failure.js +98 -0
- package/dist/src/telegram/failure.js.map +1 -0
- package/dist/src/telegram/login.d.ts +1 -0
- package/dist/src/telegram/login.js +31 -0
- package/dist/src/telegram/login.js.map +1 -0
- package/dist/src/telegram/pool.d.ts +47 -0
- package/dist/src/telegram/pool.js +300 -0
- package/dist/src/telegram/pool.js.map +1 -0
- package/dist/src/telegram/session-files.d.ts +4 -0
- package/dist/src/telegram/session-files.js +34 -0
- package/dist/src/telegram/session-files.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Readable } from "node:stream";
|
|
2
|
+
import bigInt from "big-integer";
|
|
3
|
+
import { utils } from "telegram";
|
|
4
|
+
import { iterDownload } from "telegram/client/downloads.js";
|
|
5
|
+
import { extFromMime, fetchMessage, fileNameOf, isMissingPeer, liveMediaMime, parseRange, unwrapWebPage } from "./media.js";
|
|
6
|
+
const CHUNK_BYTES = 512 * 1024;
|
|
7
|
+
const DELETED_MESSAGE = "消息已从 Telegram 删除或会话无法访问";
|
|
8
|
+
const UNAVAILABLE_MESSAGE = "无法从 Telegram 取回该媒体";
|
|
9
|
+
export class LiveMediaError extends Error {
|
|
10
|
+
status;
|
|
11
|
+
constructor(status, message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.status = status;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 在线媒体直通:一次请求独立从 Telegram 取对应字节区间并转发给响应,
|
|
18
|
+
* 逐块取用、即时释放会话,播放器的尾部元数据或拖动请求可随时插队。
|
|
19
|
+
*/
|
|
20
|
+
export class LiveMediaStreamer {
|
|
21
|
+
deps;
|
|
22
|
+
constructor(deps) {
|
|
23
|
+
this.deps = deps;
|
|
24
|
+
}
|
|
25
|
+
async serve(request, reply, file, chatUsername, download) {
|
|
26
|
+
const { media, size, mime } = await this.resolveMedia(file, chatUsername);
|
|
27
|
+
const range = request.headers.range;
|
|
28
|
+
const part = range === undefined ? undefined : parseRange(range, size);
|
|
29
|
+
if (range !== undefined && part === undefined) {
|
|
30
|
+
reply.header("content-type", "application/json; charset=utf-8");
|
|
31
|
+
reply.code(416).header("content-range", `bytes */${size}`);
|
|
32
|
+
reply.send({ error: "range 请求无效" });
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
const start = part?.start ?? 0;
|
|
36
|
+
const end = part?.end ?? size - 1;
|
|
37
|
+
reply.header("content-type", mime);
|
|
38
|
+
reply.header("accept-ranges", "bytes");
|
|
39
|
+
reply.header("cache-control", "no-store");
|
|
40
|
+
if (part !== undefined) {
|
|
41
|
+
reply.code(206);
|
|
42
|
+
reply.header("content-range", `bytes ${start}-${end}/${size}`);
|
|
43
|
+
}
|
|
44
|
+
reply.header("content-length", String(end - start + 1));
|
|
45
|
+
if (download) {
|
|
46
|
+
reply.header("content-disposition", `attachment; filename="${downloadName(file, mime)}"`);
|
|
47
|
+
}
|
|
48
|
+
return Readable.from(this.pump(media, start, end - start + 1));
|
|
49
|
+
}
|
|
50
|
+
async *pump(media, offset, totalBytes) {
|
|
51
|
+
let remaining = totalBytes;
|
|
52
|
+
let position = offset;
|
|
53
|
+
while (remaining > 0) {
|
|
54
|
+
const length = Math.min(CHUNK_BYTES, remaining);
|
|
55
|
+
const bytes = await this.fetchPart(media, position, length);
|
|
56
|
+
if (bytes === undefined || bytes.length !== length) {
|
|
57
|
+
throw new Error("live media download truncated");
|
|
58
|
+
}
|
|
59
|
+
remaining -= bytes.length;
|
|
60
|
+
position += bytes.length;
|
|
61
|
+
yield bytes;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async fetchPart(media, offset, length) {
|
|
65
|
+
return this.deps.sessions.run(async (client) => {
|
|
66
|
+
const host = client;
|
|
67
|
+
const parts = [];
|
|
68
|
+
let received = 0;
|
|
69
|
+
for await (const chunk of liveChunksOf(host, media, offset, Math.ceil(length / CHUNK_BYTES))) {
|
|
70
|
+
parts.push(chunk);
|
|
71
|
+
received += chunk.length;
|
|
72
|
+
if (received >= length)
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
if (received === 0)
|
|
76
|
+
return undefined;
|
|
77
|
+
return Buffer.concat(parts).subarray(0, length);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async resolveMedia(file, chatUsername) {
|
|
81
|
+
try {
|
|
82
|
+
const result = await this.deps.sessions.run(async (client) => {
|
|
83
|
+
const host = client;
|
|
84
|
+
const message = await fetchMessage(host, file, chatUsername);
|
|
85
|
+
if (message === undefined)
|
|
86
|
+
return "missing";
|
|
87
|
+
if (message.media === undefined || message.media === null)
|
|
88
|
+
return "unavailable";
|
|
89
|
+
const media = unwrapWebPage(message.media);
|
|
90
|
+
const info = utils.getFileInfo(media);
|
|
91
|
+
const size = totalBytesOf(info.size);
|
|
92
|
+
if (!(size > 0))
|
|
93
|
+
return "unavailable";
|
|
94
|
+
return { media, size, mime: liveMediaMime(message) };
|
|
95
|
+
});
|
|
96
|
+
if (result === "missing")
|
|
97
|
+
throw new LiveMediaError(410, DELETED_MESSAGE);
|
|
98
|
+
if (result === "unavailable")
|
|
99
|
+
throw new LiveMediaError(404, UNAVAILABLE_MESSAGE);
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error instanceof LiveMediaError)
|
|
104
|
+
throw error;
|
|
105
|
+
const missing = isMissingPeer(error);
|
|
106
|
+
if (missing) {
|
|
107
|
+
this.deps.logger.debug("live media peer missing for message " + file.messageId + ", likely deleted");
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.deps.logger.warn("live media fetch failed for message " + file.messageId, error);
|
|
111
|
+
}
|
|
112
|
+
throw new LiveMediaError(missing ? 410 : 404, missing ? DELETED_MESSAGE : UNAVAILABLE_MESSAGE);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function liveChunksOf(client, media, offset, limit) {
|
|
117
|
+
const provided = client.iterMediaChunks?.(media, { offset, limit });
|
|
118
|
+
if (provided !== undefined)
|
|
119
|
+
return provided;
|
|
120
|
+
return iterDownload(client, {
|
|
121
|
+
file: media,
|
|
122
|
+
offset: bigInt(offset),
|
|
123
|
+
limit,
|
|
124
|
+
requestSize: CHUNK_BYTES
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** gramjs 长整型在不同来源(原生 BigInt / number / big-integer 包装)下的字节数提取。 */
|
|
128
|
+
function totalBytesOf(size) {
|
|
129
|
+
if (typeof size === "bigint")
|
|
130
|
+
return Number(size);
|
|
131
|
+
if (typeof size === "number")
|
|
132
|
+
return size;
|
|
133
|
+
if (size !== undefined && size !== null && typeof size.toJSNumber === "function") {
|
|
134
|
+
return size.toJSNumber();
|
|
135
|
+
}
|
|
136
|
+
return 0;
|
|
137
|
+
}
|
|
138
|
+
/** 下载文件名:缺扩展名时按 mime 补齐。 */
|
|
139
|
+
function downloadName(file, mime) {
|
|
140
|
+
const name = fileNameOf(file, "");
|
|
141
|
+
const ext = extFromMime(mime);
|
|
142
|
+
return ext !== "" && !name.includes(".") ? name + ext : name;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../../../../packages/archive/src/console/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAK5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5H,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC;AAE/B,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAClD,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAEjD,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE5B,MAAM;IADjB,YACW,MAAc,EACvB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;IAIjB,CAAC;CACF;AAOD;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACC,IAAI;IAAjC,YAA6B,IAA4B;oBAA5B,IAAI;IAA2B,CAAC;IAE7D,KAAK,CAAC,KAAK,CACT,OAAuB,EACvB,KAAmB,EACnB,IAAqB,EACrB,YAAgC,EAChC,QAAiB;QAEjB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvE,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9C,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YACpC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACvC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,KAAK,CAAC,CAAC,IAAI,CAAC,KAAc,EAAE,MAAc,EAAE,UAAkB;QACpE,IAAI,SAAS,GAAG,UAAU,CAAC;QAC3B,IAAI,QAAQ,GAAG,MAAM,CAAC;QACtB,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YACD,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;YAC1B,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;YACzB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAc,EAAE,MAAc,EAAE,MAAc;QACpE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC7C,MAAM,IAAI,GAAG,MAAkC,CAAC;YAChD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC;gBAC7F,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;gBACzB,IAAI,QAAQ,IAAI,MAAM;oBAAE,MAAM;YAChC,CAAC;YACD,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YACrC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAqB,EAAE,YAAgC;QAKhF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC3D,MAAM,IAAI,GAAG,MAAkC,CAAC;gBAChD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;gBAC7D,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO,SAAkB,CAAC;gBACrD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI;oBAAE,OAAO,aAAsB,CAAC;gBACzF,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAgD,CAAC,CAAC;gBACjF,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;oBAAE,OAAO,aAAsB,CAAC;gBAC/C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;YACH,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACzE,IAAI,MAAM,KAAK,aAAa;gBAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;YACjF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,cAAc;gBAAE,MAAM,KAAK,CAAC;YACjD,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,GAAG,IAAI,CAAC,SAAS,GAAG,kBAAkB,CAAC,CAAC;YACvG,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACxF,CAAC;YACD,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;CACF;AAED,SAAS,YAAY,CAAC,MAAqB,EAAE,KAAc,EAAE,MAAc,EAAE,KAAa;IACxF,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,YAAY,CAAC,MAAuD,EAAE;QAC3E,IAAI,EAAE,KAA8D;QACpE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,KAAK;QACL,WAAW,EAAE,WAAW;KACzB,CAAC,CAAC;AACL,CAAC;AAED,mEAAmE;AACnE,SAAS,YAAY,CAAC,IAAa;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAQ,IAAiC,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC/G,OAAQ,IAAiC,CAAC,UAAU,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,4BAA4B;AAC5B,SAAS,YAAY,CAAC,IAAqB,EAAE,IAAY;IACvD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { RuntimeLogger, SessionAccess } from "@paperkite/sdk";
|
|
2
|
+
import type { ArchiveClient, TelegramMessage } from "../archiver.js";
|
|
3
|
+
import type { StoredMediaFile } from "../storage/index.js";
|
|
4
|
+
export interface LiveMediaResult {
|
|
5
|
+
readonly bytes: Buffer;
|
|
6
|
+
readonly mime: string;
|
|
7
|
+
}
|
|
8
|
+
/** 在线取回结果:ok 带字节流;missing 表示目标会话/消息已不可达(消息被删等常态情形)。 */
|
|
9
|
+
export type LiveMediaOutcome = ({
|
|
10
|
+
readonly ok: true;
|
|
11
|
+
} & LiveMediaResult) | {
|
|
12
|
+
readonly ok: false;
|
|
13
|
+
readonly missing: boolean;
|
|
14
|
+
};
|
|
15
|
+
/** 在线缩略图结果:noThumb 表示媒体有缩略图可用的判定失败(文档类无 thumbs)。 */
|
|
16
|
+
export type LiveThumbOutcome = ({
|
|
17
|
+
readonly ok: true;
|
|
18
|
+
} & LiveMediaResult) | {
|
|
19
|
+
readonly ok: false;
|
|
20
|
+
readonly missing: boolean;
|
|
21
|
+
readonly noThumb?: boolean;
|
|
22
|
+
};
|
|
23
|
+
export interface LiveMediaOptions {
|
|
24
|
+
/** 归档 chats 表里的会话句柄,供在线取回冷启动时解析实体。 */
|
|
25
|
+
readonly chatUsername?: string;
|
|
26
|
+
readonly logger: RuntimeLogger;
|
|
27
|
+
}
|
|
28
|
+
/** 落盘路径解析:配置 mediaDir 时限定其内,否则相对进程工作目录解析。 */
|
|
29
|
+
export declare function resolveMediaPath(raw: string | undefined, mediaDir: string | undefined): string | undefined;
|
|
30
|
+
export declare function mimeFromName(path: string): string;
|
|
31
|
+
/** 图片类媒体整图取回,其余(视频/音频/文档)走渐进式流。 */
|
|
32
|
+
export declare function isPhotoLike(value: {
|
|
33
|
+
readonly mediaType?: string;
|
|
34
|
+
readonly mimeType?: string;
|
|
35
|
+
}): boolean;
|
|
36
|
+
/** MIME 反查扩展名(用于在线取回媒体的下载命名)。 */
|
|
37
|
+
export declare function extFromMime(mime: string): string;
|
|
38
|
+
export declare function fileNameOf(file: StoredMediaFile, path: string): string;
|
|
39
|
+
export declare function parseRange(header: string, size: number): {
|
|
40
|
+
start: number;
|
|
41
|
+
end: number;
|
|
42
|
+
} | undefined;
|
|
43
|
+
/** 经注入会话从 Telegram 取回未落盘媒体;消息/媒体不可得时返回不可用结果。 */
|
|
44
|
+
export declare function fetchLiveMedia(file: StoredMediaFile, sessions: SessionAccess, options: LiveMediaOptions): Promise<LiveMediaOutcome>;
|
|
45
|
+
/**
|
|
46
|
+
* 在线取回原生缩略图:photo 用最小可用 size,document 系用 videoThumbs/thumbs 首项;
|
|
47
|
+
* 图片类无任何 size 时回退整图,其余类型(无 thumbs 的文档/音频等)报告 noThumb。
|
|
48
|
+
*/
|
|
49
|
+
export declare function fetchLiveThumb(file: StoredMediaFile, sessions: SessionAccess, options: LiveMediaOptions): Promise<LiveThumbOutcome>;
|
|
50
|
+
/** 消息内嵌网页链接的媒体(链接卡片图),解开到内部 photo/document 再判定。 */
|
|
51
|
+
export declare function unwrapWebPage(media: unknown): unknown;
|
|
52
|
+
/**
|
|
53
|
+
* 取回目标消息。冷启动会话没有实体缓存时,先按归档用户名解析实体再重试;
|
|
54
|
+
* 解析不到(渠道私密/不可达)时抛出原始错误,由缺失判定统一归类。
|
|
55
|
+
*/
|
|
56
|
+
export declare function fetchMessage(host: ArchiveClient, file: StoredMediaFile, chatUsername: string | undefined): Promise<TelegramMessage | undefined>;
|
|
57
|
+
/** 按归档用户名解析,失败后回退到会话清单扫描;返回与目标 chatId 匹配的实体。 */
|
|
58
|
+
export declare function resolveChatEntity(host: ArchiveClient, chatId: string, chatUsername: string | undefined): Promise<unknown | undefined>;
|
|
59
|
+
/** 会话/消息已删除或对当前账号不可见时的典型错误。 */
|
|
60
|
+
export declare function isMissingPeer(error: unknown): boolean;
|
|
61
|
+
export declare function liveMediaMime(message: TelegramMessage): string;
|
|
62
|
+
export interface DiskMediaInfo {
|
|
63
|
+
readonly path: string;
|
|
64
|
+
readonly size: number;
|
|
65
|
+
}
|
|
66
|
+
export declare function diskMediaInfo(file: StoredMediaFile, mediaDir: string | undefined): Promise<DiskMediaInfo | undefined>;
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { extname, resolve, sep } from "node:path";
|
|
3
|
+
import { utils } from "telegram";
|
|
4
|
+
const EXT_MIME = {
|
|
5
|
+
".jpg": "image/jpeg",
|
|
6
|
+
".jpeg": "image/jpeg",
|
|
7
|
+
".png": "image/png",
|
|
8
|
+
".webp": "image/webp",
|
|
9
|
+
".gif": "image/gif",
|
|
10
|
+
".heic": "image/heic",
|
|
11
|
+
".avif": "image/avif",
|
|
12
|
+
".svg": "image/svg+xml",
|
|
13
|
+
".mp4": "video/mp4",
|
|
14
|
+
".mov": "video/quicktime",
|
|
15
|
+
".webm": "video/webm",
|
|
16
|
+
".mkv": "video/x-matroska",
|
|
17
|
+
".mp3": "audio/mpeg",
|
|
18
|
+
".ogg": "audio/ogg",
|
|
19
|
+
".wav": "audio/wav",
|
|
20
|
+
".m4a": "audio/mp4",
|
|
21
|
+
".pdf": "application/pdf",
|
|
22
|
+
".txt": "text/plain",
|
|
23
|
+
".md": "text/markdown",
|
|
24
|
+
".json": "application/json",
|
|
25
|
+
".zip": "application/zip",
|
|
26
|
+
".7z": "application/x-7z-compressed",
|
|
27
|
+
".rar": "application/vnd.rar"
|
|
28
|
+
};
|
|
29
|
+
/** 落盘路径解析:配置 mediaDir 时限定其内,否则相对进程工作目录解析。 */
|
|
30
|
+
export function resolveMediaPath(raw, mediaDir) {
|
|
31
|
+
const text = raw?.trim();
|
|
32
|
+
if (!text)
|
|
33
|
+
return undefined;
|
|
34
|
+
const root = mediaDir?.trim() ? resolve(mediaDir) : undefined;
|
|
35
|
+
const path = root ? resolve(root, text) : resolve(process.cwd(), text);
|
|
36
|
+
if (root && path !== root && !path.startsWith(root + sep))
|
|
37
|
+
return undefined;
|
|
38
|
+
return path;
|
|
39
|
+
}
|
|
40
|
+
export function mimeFromName(path) {
|
|
41
|
+
return EXT_MIME[extname(path).toLowerCase()] ?? "application/octet-stream";
|
|
42
|
+
}
|
|
43
|
+
/** 图片类媒体整图取回,其余(视频/音频/文档)走渐进式流。 */
|
|
44
|
+
export function isPhotoLike(value) {
|
|
45
|
+
const mime = value.mimeType ?? "";
|
|
46
|
+
if (mime.startsWith("image/"))
|
|
47
|
+
return true;
|
|
48
|
+
const type = value.mediaType;
|
|
49
|
+
return type === "photo" || type === "sticker";
|
|
50
|
+
}
|
|
51
|
+
/** MIME 反查扩展名(用于在线取回媒体的下载命名)。 */
|
|
52
|
+
export function extFromMime(mime) {
|
|
53
|
+
return Object.entries(EXT_MIME).find(([, value]) => value === mime)?.[0] ?? "";
|
|
54
|
+
}
|
|
55
|
+
export function fileNameOf(file, path) {
|
|
56
|
+
const name = file.fileName?.trim().replace(/["\\]/g, "_");
|
|
57
|
+
if (name)
|
|
58
|
+
return name;
|
|
59
|
+
const base = path.split("/").pop()?.split("\\").pop();
|
|
60
|
+
return base || `media_${file.id}`;
|
|
61
|
+
}
|
|
62
|
+
export function parseRange(header, size) {
|
|
63
|
+
const match = /^bytes=(\d*)-(\d*)$/.exec(header.trim());
|
|
64
|
+
if (!match || size <= 0)
|
|
65
|
+
return undefined;
|
|
66
|
+
const startText = match[1] ?? "";
|
|
67
|
+
const endText = match[2] ?? "";
|
|
68
|
+
if (startText === "") {
|
|
69
|
+
if (endText === "")
|
|
70
|
+
return undefined;
|
|
71
|
+
const suffix = Number(endText);
|
|
72
|
+
if (!Number.isInteger(suffix) || suffix <= 0)
|
|
73
|
+
return undefined;
|
|
74
|
+
return { start: Math.max(0, size - suffix), end: size - 1 };
|
|
75
|
+
}
|
|
76
|
+
const start = Number(startText);
|
|
77
|
+
if (!Number.isInteger(start) || start < 0 || start >= size)
|
|
78
|
+
return undefined;
|
|
79
|
+
if (endText === "")
|
|
80
|
+
return { start, end: size - 1 };
|
|
81
|
+
const end = Math.min(Number(endText), size - 1);
|
|
82
|
+
if (!Number.isInteger(end) || end < start)
|
|
83
|
+
return undefined;
|
|
84
|
+
return { start, end };
|
|
85
|
+
}
|
|
86
|
+
/** 经注入会话从 Telegram 取回未落盘媒体;消息/媒体不可得时返回不可用结果。 */
|
|
87
|
+
export async function fetchLiveMedia(file, sessions, options) {
|
|
88
|
+
const { chatUsername, logger } = options;
|
|
89
|
+
try {
|
|
90
|
+
const result = await sessions.run(async (client) => {
|
|
91
|
+
const host = client;
|
|
92
|
+
const message = await fetchMessage(host, file, chatUsername);
|
|
93
|
+
if (!message)
|
|
94
|
+
return { state: "missing" };
|
|
95
|
+
if (!message.media)
|
|
96
|
+
return { state: "unavailable" };
|
|
97
|
+
const bytes = await host.downloadMedia(message, {});
|
|
98
|
+
if (bytes === undefined)
|
|
99
|
+
return { state: "unavailable" };
|
|
100
|
+
return { state: "ok", bytes, mime: liveMediaMime(message) };
|
|
101
|
+
});
|
|
102
|
+
if (result.state === "missing")
|
|
103
|
+
return { ok: false, missing: true };
|
|
104
|
+
if (result.state === "unavailable")
|
|
105
|
+
return { ok: false, missing: false };
|
|
106
|
+
const buffer = result.bytes instanceof Buffer ? result.bytes : await readFile(result.bytes);
|
|
107
|
+
return { ok: true, bytes: buffer, mime: result.mime };
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const missing = isMissingPeer(error);
|
|
111
|
+
if (missing) {
|
|
112
|
+
logger.debug("live media peer missing for message " + file.messageId + ", likely deleted");
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
logger.warn("live media fetch failed for message " + file.messageId, error);
|
|
116
|
+
}
|
|
117
|
+
return { ok: false, missing };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** photo 的最小可用 sizeType 次序(GramJS sizeTypes 中同序的最小两档)。 */
|
|
121
|
+
const PHOTO_THUMB_TYPES = ["s", "m"];
|
|
122
|
+
/**
|
|
123
|
+
* 在线取回原生缩略图:photo 用最小可用 size,document 系用 videoThumbs/thumbs 首项;
|
|
124
|
+
* 图片类无任何 size 时回退整图,其余类型(无 thumbs 的文档/音频等)报告 noThumb。
|
|
125
|
+
*/
|
|
126
|
+
export async function fetchLiveThumb(file, sessions, options) {
|
|
127
|
+
const { chatUsername, logger } = options;
|
|
128
|
+
try {
|
|
129
|
+
const result = await sessions.run(async (client) => {
|
|
130
|
+
const host = client;
|
|
131
|
+
const message = await fetchMessage(host, file, chatUsername);
|
|
132
|
+
if (!message)
|
|
133
|
+
return { state: "missing" };
|
|
134
|
+
if (!message.media)
|
|
135
|
+
return { state: "unavailable" };
|
|
136
|
+
const spec = thumbSpecOf(unwrapWebPage(message.media));
|
|
137
|
+
if (spec === undefined)
|
|
138
|
+
return { state: "no-thumb" };
|
|
139
|
+
if (spec.thumb === undefined) {
|
|
140
|
+
const bytes = await host.downloadMedia(message, {});
|
|
141
|
+
if (bytes === undefined)
|
|
142
|
+
return { state: "unavailable" };
|
|
143
|
+
return { state: "ok", bytes, mime: liveMediaMime(message) };
|
|
144
|
+
}
|
|
145
|
+
const bytes = await host.downloadMedia(message, { thumb: spec.thumb });
|
|
146
|
+
if (bytes === undefined || (Buffer.isBuffer(bytes) && bytes.length === 0)) {
|
|
147
|
+
return { state: "unavailable" };
|
|
148
|
+
}
|
|
149
|
+
return { state: "ok", bytes, mime: spec.mime };
|
|
150
|
+
});
|
|
151
|
+
if (result.state === "missing")
|
|
152
|
+
return { ok: false, missing: true };
|
|
153
|
+
if (result.state === "no-thumb")
|
|
154
|
+
return { ok: false, missing: false, noThumb: true };
|
|
155
|
+
if (result.state === "unavailable")
|
|
156
|
+
return { ok: false, missing: false };
|
|
157
|
+
const buffer = result.bytes instanceof Buffer ? result.bytes : await readFile(result.bytes);
|
|
158
|
+
return { ok: true, bytes: buffer, mime: snifImageMime(buffer) ?? result.mime };
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
const missing = isMissingPeer(error);
|
|
162
|
+
if (missing) {
|
|
163
|
+
logger.debug("live media peer missing for message " + file.messageId + ", likely deleted");
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
logger.warn("live media thumb fetch failed for message " + file.messageId, error);
|
|
167
|
+
}
|
|
168
|
+
return { ok: false, missing };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function thumbSpecOf(media) {
|
|
172
|
+
const name = className(media);
|
|
173
|
+
if (name === "MessageMediaPhoto") {
|
|
174
|
+
const photo = recordOf(recordOf(media)?.photo);
|
|
175
|
+
const sizes = [...arrayOf(photo?.sizes), ...arrayOf(photo?.videoSizes)];
|
|
176
|
+
const size = pickPhotoThumb(sizes);
|
|
177
|
+
return { thumb: size === undefined ? undefined : typeOf(size) ?? size, mime: "image/jpeg" };
|
|
178
|
+
}
|
|
179
|
+
if (name === "MessageMediaDocument") {
|
|
180
|
+
const document = recordOf(recordOf(media)?.document);
|
|
181
|
+
if (document === undefined)
|
|
182
|
+
return undefined;
|
|
183
|
+
const videoThumbs = arrayOf(document.videoThumbs);
|
|
184
|
+
if (videoThumbs.length > 0)
|
|
185
|
+
return { thumb: videoThumbs[0], mime: "image/jpeg" };
|
|
186
|
+
const size = arrayOf(document.thumbs).find(isUsableThumb);
|
|
187
|
+
if (size === undefined)
|
|
188
|
+
return undefined;
|
|
189
|
+
return { thumb: typeOf(size) ?? size, mime: "image/jpeg" };
|
|
190
|
+
}
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
/** 消息内嵌网页链接的媒体(链接卡片图),解开到内部 photo/document 再判定。 */
|
|
194
|
+
export function unwrapWebPage(media) {
|
|
195
|
+
if (className(media) !== "MessageMediaWebPage")
|
|
196
|
+
return media;
|
|
197
|
+
const webpage = recordOf(recordOf(media)?.webpage);
|
|
198
|
+
if (webpage === undefined)
|
|
199
|
+
return media;
|
|
200
|
+
return webpage.document ?? webpage.photo ?? media;
|
|
201
|
+
}
|
|
202
|
+
/** 按 sizeType 优先取最小可用 photo size;无匹配时按字节量取最小项。 */
|
|
203
|
+
function pickPhotoThumb(sizes) {
|
|
204
|
+
for (const type of PHOTO_THUMB_TYPES) {
|
|
205
|
+
const size = sizes.find((item) => typeOf(item) === type && isUsableThumb(item));
|
|
206
|
+
if (size !== undefined)
|
|
207
|
+
return size;
|
|
208
|
+
}
|
|
209
|
+
return smallestThumb(sizes);
|
|
210
|
+
}
|
|
211
|
+
function smallestThumb(thumbs) {
|
|
212
|
+
const usable = thumbs.filter(isUsableThumb);
|
|
213
|
+
if (usable.length === 0)
|
|
214
|
+
return undefined;
|
|
215
|
+
return usable.reduce((best, item) => (thumbWeight(item) < thumbWeight(best) ? item : best));
|
|
216
|
+
}
|
|
217
|
+
function isUsableThumb(value) {
|
|
218
|
+
const name = className(value);
|
|
219
|
+
return name !== "PhotoSizeEmpty" && name !== "PhotoPathSize";
|
|
220
|
+
}
|
|
221
|
+
function typeOf(value) {
|
|
222
|
+
const record = recordOf(value);
|
|
223
|
+
return record && typeof record.type === "string" && record.type ? record.type : undefined;
|
|
224
|
+
}
|
|
225
|
+
/** 与 gramjs getThumb 排序一致的最小化权重:越小越接近最小缩略图。 */
|
|
226
|
+
function thumbWeight(value) {
|
|
227
|
+
const record = recordOf(value);
|
|
228
|
+
if (record === undefined)
|
|
229
|
+
return 0;
|
|
230
|
+
switch (className(value)) {
|
|
231
|
+
case "PhotoStrippedSize":
|
|
232
|
+
case "PhotoCachedSize":
|
|
233
|
+
return numberValue(record.bytes?.length) ?? 0;
|
|
234
|
+
case "PhotoSize":
|
|
235
|
+
return numberValue(record.size) ?? 0;
|
|
236
|
+
case "PhotoSizeProgressive": {
|
|
237
|
+
const sizes = arrayOf(record.sizes).map((item) => numberValue(item) ?? 0);
|
|
238
|
+
return sizes.length > 0 ? Math.max(...sizes) : 0;
|
|
239
|
+
}
|
|
240
|
+
case "VideoSize":
|
|
241
|
+
return numberValue(record.size) ?? 0;
|
|
242
|
+
default:
|
|
243
|
+
return 0;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function numberValue(value) {
|
|
247
|
+
if (value === undefined || value === null || value === "")
|
|
248
|
+
return undefined;
|
|
249
|
+
const number = Number(value);
|
|
250
|
+
return Number.isFinite(number) ? number : undefined;
|
|
251
|
+
}
|
|
252
|
+
/** 贴纸/动图缩略图常以 webp 字节返回:按魔数修正 content-type。 */
|
|
253
|
+
function snifImageMime(bytes) {
|
|
254
|
+
if (bytes.length >= 12 && bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46 &&
|
|
255
|
+
bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50) {
|
|
256
|
+
return "image/webp";
|
|
257
|
+
}
|
|
258
|
+
if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff)
|
|
259
|
+
return "image/jpeg";
|
|
260
|
+
if (bytes.length >= 8 && bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47)
|
|
261
|
+
return "image/png";
|
|
262
|
+
if (bytes.length >= 6 && bytes[0] === 0x47 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46)
|
|
263
|
+
return "image/gif";
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
function arrayOf(value) {
|
|
267
|
+
return Array.isArray(value) ? value : [];
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* 取回目标消息。冷启动会话没有实体缓存时,先按归档用户名解析实体再重试;
|
|
271
|
+
* 解析不到(渠道私密/不可达)时抛出原始错误,由缺失判定统一归类。
|
|
272
|
+
*/
|
|
273
|
+
export async function fetchMessage(host, file, chatUsername) {
|
|
274
|
+
try {
|
|
275
|
+
return await fetchById(host, file, file.chatId);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (!isUnresolvedEntityError(error))
|
|
279
|
+
throw error;
|
|
280
|
+
const entity = await resolveChatEntity(host, file.chatId, chatUsername);
|
|
281
|
+
if (entity === undefined)
|
|
282
|
+
throw error;
|
|
283
|
+
return fetchById(host, file, entity);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
async function fetchById(host, file, entity) {
|
|
287
|
+
const messages = await host.getMessages(entity, { ids: [file.messageId] });
|
|
288
|
+
return messages.find((item) => item !== undefined && item !== null && item.id === file.messageId);
|
|
289
|
+
}
|
|
290
|
+
/** 按归档用户名解析,失败后回退到会话清单扫描;返回与目标 chatId 匹配的实体。 */
|
|
291
|
+
export async function resolveChatEntity(host, chatId, chatUsername) {
|
|
292
|
+
const handle = chatUsername?.trim().replace(/^@/, "");
|
|
293
|
+
if (handle) {
|
|
294
|
+
try {
|
|
295
|
+
const entity = await host.getEntity("@" + handle);
|
|
296
|
+
if (peerIdOf(entity) === chatId)
|
|
297
|
+
return entity;
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
// 句柄失效(删除/更名/私密),继续尝试会话清单
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
try {
|
|
304
|
+
for await (const dialog of host.iterDialogs()) {
|
|
305
|
+
const entity = dialog.entity;
|
|
306
|
+
if (entity !== undefined && entity !== null && peerIdOf(entity) === chatId)
|
|
307
|
+
return entity;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
// 会话清单不可迭代时按解析失败处理
|
|
312
|
+
}
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
315
|
+
function peerIdOf(entity) {
|
|
316
|
+
try {
|
|
317
|
+
return String(utils.getPeerId(entity));
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return "";
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/** 会话/消息已删除或对当前账号不可见时的典型错误。 */
|
|
324
|
+
export function isMissingPeer(error) {
|
|
325
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
326
|
+
return /could not find (the )?input entity|could not find the entity|CHANNEL_PRIVATE|CHANNEL_INVALID|CHANNEL_FORBIDDEN|CHAT_FORBIDDEN|chat (was )?not found|peer id is invalid/i.test(message);
|
|
327
|
+
}
|
|
328
|
+
/** gramjs 本地实体缓存缺失、尚可尝试解析的错误。 */
|
|
329
|
+
function isUnresolvedEntityError(error) {
|
|
330
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
331
|
+
return /could not find (the )?input entity/i.test(message);
|
|
332
|
+
}
|
|
333
|
+
export function liveMediaMime(message) {
|
|
334
|
+
const media = message.media;
|
|
335
|
+
if (className(media) === "MessageMediaPhoto")
|
|
336
|
+
return "image/jpeg";
|
|
337
|
+
if (className(media) === "MessageMediaDocument") {
|
|
338
|
+
const document = recordOf(recordOf(media)?.document);
|
|
339
|
+
const mime = document?.mimeType;
|
|
340
|
+
if (typeof mime === "string" && mime.trim())
|
|
341
|
+
return mime.trim();
|
|
342
|
+
}
|
|
343
|
+
return "application/octet-stream";
|
|
344
|
+
}
|
|
345
|
+
function className(value) {
|
|
346
|
+
if (value === null || value === undefined)
|
|
347
|
+
return "";
|
|
348
|
+
const record = recordOf(value);
|
|
349
|
+
if (record && typeof record.className === "string" && record.className)
|
|
350
|
+
return record.className;
|
|
351
|
+
return value.constructor?.name ?? "";
|
|
352
|
+
}
|
|
353
|
+
function recordOf(value) {
|
|
354
|
+
return typeof value === "object" && value !== null ? value : undefined;
|
|
355
|
+
}
|
|
356
|
+
export async function diskMediaInfo(file, mediaDir) {
|
|
357
|
+
const path = resolveMediaPath(file.filePath, mediaDir);
|
|
358
|
+
if (!path)
|
|
359
|
+
return undefined;
|
|
360
|
+
try {
|
|
361
|
+
const info = await stat(path);
|
|
362
|
+
return info.isFile() ? { path, size: info.size } : undefined;
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../../../packages/archive/src/console/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { RuntimeLogger, SessionAccess } from "@paperkite/sdk";
|
|
3
|
+
import type { ArchiveStore } from "../storage/index.js";
|
|
4
|
+
export interface ArchiveConsoleServerOptions {
|
|
5
|
+
readonly store: ArchiveStore;
|
|
6
|
+
readonly backend?: string;
|
|
7
|
+
readonly mediaDir?: string;
|
|
8
|
+
readonly session?: string;
|
|
9
|
+
readonly sessions?: SessionAccess;
|
|
10
|
+
readonly logger: RuntimeLogger;
|
|
11
|
+
}
|
|
12
|
+
export declare function createArchiveConsoleServer(options: ArchiveConsoleServerOptions): FastifyInstance;
|