@yaebal/panel 0.0.1 → 0.0.2

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/lib/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { media } from "@yaebal/core";
1
2
  import { PANEL_HTML } from "./panel-html.js";
2
3
  /** keep at most this many messages per chat in the in-memory store. */
3
4
  const MAX_HISTORY = 1000;
@@ -11,10 +12,72 @@ function safeEqual(a, b) {
11
12
  return diff === 0;
12
13
  }
13
14
  export { PANEL_HTML } from "./panel-html.js";
15
+ /** single-file media kinds (photo is special — it's an array of sizes). */
16
+ const FILE_KINDS = [
17
+ "video",
18
+ "animation",
19
+ "audio",
20
+ "voice",
21
+ "video_note",
22
+ "document",
23
+ "sticker",
24
+ ];
25
+ /** non-downloadable kinds we still label in the chat preview. */
26
+ const TAG_KINDS = ["location", "contact", "poll", "dice"];
27
+ /** pull every downloadable attachment out of a telegram message. */
28
+ function extractAttachments(message) {
29
+ const out = [];
30
+ const photo = message.photo;
31
+ if (Array.isArray(photo) && photo.length > 0) {
32
+ const largest = photo[photo.length - 1];
33
+ if (largest.file_id)
34
+ out.push({ type: "photo", fileId: largest.file_id });
35
+ }
36
+ for (const kind of FILE_KINDS) {
37
+ const m = message[kind];
38
+ if (m && typeof m.file_id === "string") {
39
+ out.push({ type: kind, fileId: m.file_id, fileName: m.file_name, mimeType: m.mime_type });
40
+ }
41
+ }
42
+ return out;
43
+ }
44
+ /** best-effort one-line label for a message: its text/caption, else a `[media]` tag. */
45
+ function describe(message) {
46
+ if (!message)
47
+ return undefined;
48
+ const text = message.text ?? message.caption;
49
+ if (typeof text === "string")
50
+ return text;
51
+ const att = extractAttachments(message);
52
+ if (att.length > 0)
53
+ return `[${att[0].type}]`;
54
+ for (const kind of TAG_KINDS) {
55
+ if (message[kind] !== undefined)
56
+ return `[${kind}]`;
57
+ }
58
+ return undefined;
59
+ }
60
+ /** build a {@link PanelMessage} from a telegram message, or undefined if nothing to log. */
61
+ function toPanelMessage(direction, message) {
62
+ if (!message)
63
+ return undefined;
64
+ const text = describe(message);
65
+ const attachments = extractAttachments(message);
66
+ if (text === undefined && attachments.length === 0)
67
+ return undefined;
68
+ const date = typeof message.date === "number" ? message.date : Math.floor(Date.now() / 1000);
69
+ const msg = { direction, text: text ?? "", date };
70
+ if (attachments.length > 0)
71
+ msg.attachments = attachments;
72
+ if (typeof message.media_group_id === "string")
73
+ msg.mediaGroupId = message.media_group_id;
74
+ return msg;
75
+ }
14
76
  /** defaults to in-memory store. Lost on restart — swap for a persistent one in production. */
15
77
  export class MemoryPanelStore {
16
78
  #chats = new Map();
17
79
  #messages = new Map();
80
+ #listeners = new Set();
18
81
  record(chat, message) {
19
82
  const list = this.#messages.get(chat.id) ?? [];
20
83
  list.push(message);
@@ -28,79 +91,366 @@ export class MemoryPanelStore {
28
91
  lastText: message.text,
29
92
  lastDate: message.date,
30
93
  });
94
+ for (const fn of this.#listeners) {
95
+ fn({ type: "record", chatId: chat.id, direction: message.direction });
96
+ }
31
97
  }
32
98
  chats() {
33
99
  return [...this.#chats.values()].sort((a, b) => b.lastDate - a.lastDate);
34
100
  }
35
- history(chatId) {
36
- return this.#messages.get(chatId) ?? [];
101
+ history(chatId, options) {
102
+ let list = this.#messages.get(chatId) ?? [];
103
+ if (options?.before !== undefined)
104
+ list = list.filter((m) => m.date < options.before);
105
+ if (options?.limit !== undefined)
106
+ list = list.slice(-options.limit);
107
+ return list;
108
+ }
109
+ subscribe(listener) {
110
+ this.#listeners.add(listener);
111
+ return () => this.#listeners.delete(listener);
37
112
  }
38
113
  }
39
114
  /** records incoming private-chat text into the store so the panel can show it. */
40
115
  export function recorder(store) {
41
116
  const plugin = (composer) => composer.use(async (ctx, next) => {
42
- const text = ctx.text;
43
117
  const chat = ctx.chat;
44
- if (text !== undefined && chat?.type === "private") {
118
+ const message = toPanelMessage("in", ctx.message);
119
+ if (message && chat?.type === "private") {
45
120
  const name = ctx.from?.username
46
121
  ? `@${ctx.from.username}`
47
122
  : (ctx.from?.first_name ?? `chat ${chat.id}`);
48
- await store.record({ id: chat.id, name }, { direction: "in", text, date: Math.floor(Date.now() / 1000) });
123
+ await store.record({ id: chat.id, name }, message);
49
124
  }
50
125
  await next();
51
126
  });
52
127
  return plugin;
53
128
  }
129
+ /** map an attachment kind to its telegram send method + param field. */
130
+ const SEND_METHODS = {
131
+ photo: { method: "sendPhoto", field: "photo" },
132
+ video: { method: "sendVideo", field: "video" },
133
+ animation: { method: "sendAnimation", field: "animation" },
134
+ audio: { method: "sendAudio", field: "audio" },
135
+ voice: { method: "sendVoice", field: "voice" },
136
+ video_note: { method: "sendVideoNote", field: "video_note" },
137
+ document: { method: "sendDocument", field: "document" },
138
+ sticker: { method: "sendSticker", field: "sticker" },
139
+ };
140
+ /** choose how to send an operator-uploaded file: explicit `type`, else infer from mime. */
141
+ function pickSendKind(type, mime) {
142
+ if (type && type in SEND_METHODS)
143
+ return type;
144
+ if (mime.startsWith("image/"))
145
+ return mime === "image/gif" ? "animation" : "photo";
146
+ if (mime.startsWith("video/"))
147
+ return "video";
148
+ if (mime === "audio/ogg")
149
+ return "voice";
150
+ if (mime.startsWith("audio/"))
151
+ return "audio";
152
+ return "document";
153
+ }
154
+ /** log a single telegram message result as an outgoing record (text or media). */
155
+ function recordResult(store, result) {
156
+ if (!result || typeof result !== "object")
157
+ return;
158
+ const raw = result;
159
+ const chat = raw.chat;
160
+ if (chat?.id === undefined || chat.type !== "private")
161
+ return;
162
+ const message = toPanelMessage("out", raw);
163
+ if (message)
164
+ void Promise.resolve(store.record({ id: chat.id }, message));
165
+ }
166
+ /**
167
+ * record replies the bot sends *outside* the panel (e.g. `ctx.reply(...)` or `ctx.replyWithPhoto(...)`
168
+ * in your handlers) so they show up in the conversation too. hooks the api's `after` stage and logs
169
+ * every successful `send*` call (including `sendMediaGroup`, which returns an array) to a private chat.
170
+ *
171
+ * pairs with `panelHandler(..., { recordSends: false })` — the panel records its own sends,
172
+ * so disable that to avoid double entries when this is installed.
173
+ *
174
+ * ```ts
175
+ * recordOutgoing(bot.api, store);
176
+ * const handler = panelHandler(bot.api, store, { token, recordSends: false });
177
+ * ```
178
+ */
179
+ export function recordOutgoing(api, store) {
180
+ api.after((method, result) => {
181
+ if (method.startsWith("send")) {
182
+ if (Array.isArray(result))
183
+ for (const item of result)
184
+ recordResult(store, item);
185
+ else
186
+ recordResult(store, result);
187
+ }
188
+ return result;
189
+ });
190
+ return api;
191
+ }
54
192
  const json = (data, status = 200) => new Response(JSON.stringify(data), {
55
193
  status,
56
194
  headers: { "content-type": "application/json", "x-content-type-options": "nosniff" },
57
195
  });
196
+ /** resolve the `Access-Control-Allow-Origin` value for a request, or undefined if disallowed. */
197
+ function corsOrigin(cors, request) {
198
+ if (cors === undefined)
199
+ return undefined;
200
+ if (cors === "*")
201
+ return "*";
202
+ const origin = request.headers.get("origin");
203
+ if (!origin)
204
+ return undefined;
205
+ const allowed = Array.isArray(cors) ? cors : [cors];
206
+ return allowed.includes(origin) ? origin : undefined;
207
+ }
208
+ /** fields a panel client may pass through to `sendMessage` alongside `chat_id`/`text`. */
209
+ const SEND_PASSTHROUGH = ["parse_mode", "reply_to_message_id", "reply_parameters"];
210
+ /** normalize a mount prefix: `""` or `/foo` (no trailing slash). */
211
+ function normalizeBase(basePath) {
212
+ if (!basePath)
213
+ return "";
214
+ const trimmed = basePath.replace(/\/+$/, "");
215
+ return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
216
+ }
217
+ /** a tiny in-memory limiter for failed auth attempts, keyed per client. */
218
+ function createLimiter(config) {
219
+ if (config === false)
220
+ return undefined;
221
+ const max = config?.max ?? 10;
222
+ const windowMs = config?.windowMs ?? 60_000;
223
+ const hits = new Map();
224
+ return {
225
+ /** ms the caller must wait, or 0 if still allowed. */
226
+ blockedFor(key) {
227
+ const now = Date.now();
228
+ const entry = hits.get(key);
229
+ if (entry && now < entry.resetAt && entry.count >= max) {
230
+ return entry.resetAt - now;
231
+ }
232
+ return 0;
233
+ },
234
+ fail(key) {
235
+ const now = Date.now();
236
+ const entry = hits.get(key);
237
+ if (!entry || now >= entry.resetAt) {
238
+ hits.set(key, { count: 1, resetAt: now + windowMs });
239
+ }
240
+ else {
241
+ entry.count++;
242
+ }
243
+ },
244
+ reset(key) {
245
+ hits.delete(key);
246
+ },
247
+ };
248
+ }
249
+ function defaultClientKey(request) {
250
+ const fwd = request.headers.get("x-forwarded-for");
251
+ if (fwd)
252
+ return fwd.split(",")[0].trim();
253
+ return request.headers.get("x-real-ip") ?? "shared";
254
+ }
255
+ /** an SSE response that forwards store events to the browser (keep-alive pinged). */
256
+ function streamResponse(store) {
257
+ const encoder = new TextEncoder();
258
+ let unsubscribe;
259
+ let ping;
260
+ const stream = new ReadableStream({
261
+ start(controller) {
262
+ const push = (chunk) => {
263
+ try {
264
+ controller.enqueue(encoder.encode(chunk));
265
+ }
266
+ catch {
267
+ /* client gone — cancel() will clean up */
268
+ }
269
+ };
270
+ push(": connected\n\n");
271
+ unsubscribe = store.subscribe?.((event) => push(`event: record\ndata: ${JSON.stringify(event)}\n\n`));
272
+ ping = setInterval(() => push(": ping\n\n"), 25_000);
273
+ },
274
+ cancel() {
275
+ if (ping)
276
+ clearInterval(ping);
277
+ unsubscribe?.();
278
+ },
279
+ });
280
+ return new Response(stream, {
281
+ headers: {
282
+ "content-type": "text/event-stream; charset=utf-8",
283
+ "cache-control": "no-cache, no-transform",
284
+ "x-content-type-options": "nosniff",
285
+ },
286
+ });
287
+ }
58
288
  /**
59
- * a fetch-style handler for the operator panel: serves the ui at `/`, and a small
60
- * api to list chats, read a conversation, and send a reply. mount it on any
61
- * fetch-compatible server. open it at `/?token=<your token>`.
289
+ * a fetch-style handler for the operator panel: serves the login + chat UI at the mount
290
+ * root, and a small api to list chats, read a conversation, stream updates, and send a
291
+ * reply. mount it on any fetch-compatible server.
62
292
  */
63
293
  export function panelHandler(api, store, options) {
64
294
  if (!options.token)
65
295
  throw new Error("panelHandler: a non-empty token is required");
296
+ const base = normalizeBase(options.basePath);
297
+ const limiter = createLimiter(options.rateLimit);
298
+ const clientKey = options.clientKey ?? defaultClientKey;
66
299
  return async (request) => {
300
+ const allowOrigin = corsOrigin(options.cors, request);
301
+ // attach CORS headers (when enabled) to every response the handler returns
302
+ const finish = (response) => {
303
+ if (allowOrigin) {
304
+ response.headers.set("access-control-allow-origin", allowOrigin);
305
+ response.headers.set("vary", "origin");
306
+ }
307
+ return response;
308
+ };
309
+ // preflight is unauthenticated by spec — answer it before the token check
310
+ if (request.method === "OPTIONS") {
311
+ return finish(new Response(null, {
312
+ status: 204,
313
+ headers: {
314
+ "access-control-allow-methods": "GET, POST, OPTIONS",
315
+ "access-control-allow-headers": "authorization, content-type",
316
+ "access-control-max-age": "86400",
317
+ },
318
+ }));
319
+ }
67
320
  const url = new URL(request.url);
321
+ // resolve the path relative to the configured mount prefix
322
+ let path = url.pathname;
323
+ if (base) {
324
+ if (path === base)
325
+ path = "/";
326
+ else if (path.startsWith(`${base}/`))
327
+ path = path.slice(base.length);
328
+ else
329
+ return finish(json({ error: "not found" }, 404));
330
+ }
331
+ // the login + app shell is public; auth is enforced on /api/* only
332
+ if (path === "/" && request.method === "GET") {
333
+ return finish(new Response(PANEL_HTML.replaceAll("__BASE__", base), {
334
+ headers: {
335
+ "content-type": "text/html; charset=utf-8",
336
+ // tokens are never put in the page url anymore, but stay strict anyway
337
+ "referrer-policy": "no-referrer",
338
+ "content-security-policy": "default-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; connect-src 'self'",
339
+ "x-content-type-options": "nosniff",
340
+ },
341
+ }));
342
+ }
343
+ // ---- everything below requires a valid token ----
344
+ const key = clientKey(request);
345
+ const wait = limiter?.blockedFor(key) ?? 0;
346
+ if (wait > 0) {
347
+ const res = json({ error: "too many attempts" }, 429);
348
+ res.headers.set("retry-after", String(Math.ceil(wait / 1000)));
349
+ return finish(res);
350
+ }
68
351
  const provided = url.searchParams.get("token") ??
69
352
  request.headers.get("authorization")?.replace(/^Bearer\s+/i, "") ??
70
353
  "";
71
354
  // fail closed: reject empty/missing tokens and use a constant-time compare
72
355
  if (!provided || !safeEqual(provided, options.token)) {
73
- return new Response("unauthorized", { status: 401 });
356
+ limiter?.fail(key);
357
+ return finish(new Response("unauthorized", { status: 401 }));
74
358
  }
75
- if (url.pathname === "/" && request.method === "GET") {
76
- return new Response(PANEL_HTML, {
359
+ limiter?.reset(key);
360
+ if (path === "/api/chats" && request.method === "GET") {
361
+ return finish(json(await store.chats()));
362
+ }
363
+ // realtime stream of store events (EventSource can't set headers → token in query)
364
+ if (path === "/api/stream" && request.method === "GET") {
365
+ return finish(streamResponse(store));
366
+ }
367
+ // proxy a telegram file by file_id, keeping the bot token server-side
368
+ if (path === "/api/file" && request.method === "GET") {
369
+ const fileId = url.searchParams.get("id");
370
+ if (!fileId)
371
+ return finish(json({ error: "id required" }, 400));
372
+ if (!api.call || !api.fileUrl) {
373
+ return finish(json({ error: "media proxy needs an api with call()/fileUrl()" }, 501));
374
+ }
375
+ const file = await api
376
+ .call("getFile", { file_id: fileId })
377
+ .catch(() => undefined);
378
+ if (!file?.file_path)
379
+ return finish(json({ error: "file not found" }, 404));
380
+ const upstream = await fetch(api.fileUrl(file.file_path));
381
+ if (!upstream.ok || !upstream.body)
382
+ return finish(json({ error: "download failed" }, 502));
383
+ return finish(new Response(upstream.body, {
77
384
  headers: {
78
- "content-type": "text/html; charset=utf-8",
79
- // the token rides in the URL on this initial load — keep it out of Referer
80
- "referrer-policy": "no-referrer",
81
- "content-security-policy": "default-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'",
385
+ "content-type": upstream.headers.get("content-type") ?? "application/octet-stream",
386
+ "cache-control": "private, max-age=86400",
82
387
  "x-content-type-options": "nosniff",
83
388
  },
84
- });
85
- }
86
- if (url.pathname === "/api/chats" && request.method === "GET") {
87
- return json(await store.chats());
389
+ }));
88
390
  }
89
- const get = url.pathname.match(/^\/api\/chats\/(-?\d+)$/);
391
+ const get = path.match(/^\/api\/chats\/(-?\d+)$/);
90
392
  if (get?.[1] && request.method === "GET") {
91
- return json(await store.history(Number(get[1])));
393
+ const before = url.searchParams.get("before");
394
+ const limit = url.searchParams.get("limit");
395
+ const opts = {};
396
+ if (before !== null)
397
+ opts.before = Number(before);
398
+ if (limit !== null)
399
+ opts.limit = Number(limit);
400
+ return finish(json(await store.history(Number(get[1]), opts)));
92
401
  }
93
- const send = url.pathname.match(/^\/api\/chats\/(-?\d+)\/send$/);
402
+ const send = path.match(/^\/api\/chats\/(-?\d+)\/send$/);
94
403
  if (send?.[1] && request.method === "POST") {
95
404
  const chatId = Number(send[1]);
405
+ const contentType = request.headers.get("content-type") ?? "";
406
+ // ---- operator file upload (multipart) → sendPhoto / sendDocument / sendVoice / … ----
407
+ if (contentType.includes("multipart/form-data")) {
408
+ if (!api.call) {
409
+ return finish(json({ error: "uploads need an api with call()" }, 501));
410
+ }
411
+ const form = await request.formData().catch(() => undefined);
412
+ const file = form?.get("file");
413
+ if (!(file instanceof Blob))
414
+ return finish(json({ error: "file required" }, 400));
415
+ const kind = pickSendKind(String(form?.get("type") ?? ""), file.type);
416
+ const { method, field } = SEND_METHODS[kind];
417
+ const filename = file.name || kind;
418
+ const bytes = new Uint8Array(await file.arrayBuffer());
419
+ const params = {
420
+ chat_id: chatId,
421
+ [field]: media.buffer(bytes, filename),
422
+ };
423
+ const caption = form?.get("caption");
424
+ if (typeof caption === "string" && caption)
425
+ params.caption = caption;
426
+ const result = await api.call(method, params);
427
+ if (options.recordSends !== false)
428
+ recordResult(store, result);
429
+ return finish(json({ ok: true }));
430
+ }
431
+ // ---- text reply (json) → sendMessage ----
96
432
  const body = (await request.json().catch(() => ({})));
97
- if (!body.text)
98
- return json({ error: "text required" }, 400);
99
- await api.sendMessage({ chat_id: chatId, text: body.text });
100
- await store.record({ id: chatId }, { direction: "out", text: body.text, date: Math.floor(Date.now() / 1000) });
101
- return json({ ok: true });
433
+ if (typeof body.text !== "string" || !body.text) {
434
+ return finish(json({ error: "text required" }, 400));
435
+ }
436
+ const params = { chat_id: chatId, text: body.text };
437
+ for (const field of SEND_PASSTHROUGH) {
438
+ if (body[field] !== undefined)
439
+ params[field] = body[field];
440
+ }
441
+ const result = await api.sendMessage(params);
442
+ // skip when recordOutgoing already logs every send (avoids double entries)
443
+ if (options.recordSends !== false) {
444
+ // record from the api result when it's a real message, else fall back to the text
445
+ if (result && typeof result === "object" && "chat" in result)
446
+ recordResult(store, result);
447
+ else {
448
+ await store.record({ id: chatId }, { direction: "out", text: body.text, date: Math.floor(Date.now() / 1000) });
449
+ }
450
+ }
451
+ return finish(json({ ok: true }));
102
452
  }
103
- return json({ error: "not found" }, 404);
453
+ return finish(json({ error: "not found" }, 404));
104
454
  };
105
455
  }
106
456
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}