



















@@ -178,6 +178,8 @@ export function createTelegramDraftStream(params: {
178178throttleMs?: number;
179179/** Minimum chars before sending first message (debounce for push notifications) */
180180minInitialChars?: number;
181+/** Maximum time to hold a short first preview before materializing it anyway. */
182+minInitialDelayMs?: number;
181183/** Optional preview renderer (e.g. markdown -> HTML + parse mode). */
182184renderText?: (text: string) => TelegramDraftPreview;
183185/** Called when a late send resolves after forceNewMessage() switched generations. */
@@ -190,6 +192,7 @@ export function createTelegramDraftStream(params: {
190192const maxChars = Math.min(params.maxChars ?? transportLimit, transportLimit);
191193const throttleMs = Math.max(250, params.throttleMs ?? DEFAULT_THROTTLE_MS);
192194const minInitialChars = params.minInitialChars;
195+const minInitialDelayMs = params.minInitialDelayMs;
193196const chatId = params.chatId;
194197const threadParams = buildTelegramThreadParams(params.thread);
195198const replyToMessageId = normalizeTelegramReplyToMessageId(params.replyToMessageId);
@@ -224,6 +227,8 @@ export function createTelegramDraftStream(params: {
224227let lastDeliveredText = "";
225228let lastRequestedText = "";
226229let lastRequestedPreview: TelegramDraftPreview | undefined;
230+let firstShortPreviewSeenMs: number | undefined;
231+let initialPreviewTimer: ReturnType<typeof setTimeout> | undefined;
227232let previewRevision = 0;
228233let generation = 0;
229234let deliveredTextOffset = 0;
@@ -319,6 +324,26 @@ export function createTelegramDraftStream(params: {
319324streamVisibleSinceMs = visibleSinceMs;
320325return true;
321326};
327+const clearInitialPreviewTimer = () => {
328+if (initialPreviewTimer) {
329+clearTimeout(initialPreviewTimer);
330+initialPreviewTimer = undefined;
331+}
332+};
333+const scheduleInitialPreviewFlush = (delayMs: number) => {
334+if (initialPreviewTimer) {
335+return;
336+}
337+initialPreviewTimer = setTimeout(
338+() => {
339+initialPreviewTimer = undefined;
340+void flushInitialPreview().catch((err: unknown) => {
341+params.warn?.(`telegram stream preview delayed send failed: ${formatErrorMessage(err)}`);
342+});
343+},
344+Math.max(0, delayMs),
345+);
346+};
322347const stopOversizedPreview = (payloadLength: number): false => {
323348streamState.stopped = true;
324349params.warn?.(`telegram stream preview stopped (text length ${payloadLength} > ${maxChars})`);
@@ -405,8 +430,24 @@ export function createTelegramDraftStream(params: {
405430406431if (typeof streamMessageId !== "number" && minInitialChars != null && !streamState.final) {
407432if (renderedText.length < minInitialChars) {
408-return false;
433+if (minInitialDelayMs == null) {
434+return false;
435+}
436+const now = Date.now();
437+firstShortPreviewSeenMs ??= now;
438+const remainingDelayMs = minInitialDelayMs - (now - firstShortPreviewSeenMs);
439+if (remainingDelayMs > 0) {
440+scheduleInitialPreviewFlush(remainingDelayMs);
441+return false;
442+}
443+clearInitialPreviewTimer();
444+} else {
445+firstShortPreviewSeenMs = undefined;
446+clearInitialPreviewTimer();
409447}
448+} else {
449+firstShortPreviewSeenMs = undefined;
450+clearInitialPreviewTimer();
410451}
411452412453const previousSentPreviewKey = lastSentPreviewKey;
@@ -467,6 +508,7 @@ export function createTelegramDraftStream(params: {
467508state: streamState,
468509 sendOrEditStreamMessage,
469510});
511+const flushInitialPreview = loop.flush;
470512471513const requestDraftUpdate = (text: string, preview?: TelegramDraftPreview) => {
472514if (streamState.stopped || streamState.final) {
@@ -513,6 +555,8 @@ export function createTelegramDraftStream(params: {
513555messageSendAttempted = false;
514556streamMessageId = undefined;
515557streamVisibleSinceMs = undefined;
558+firstShortPreviewSeenMs = undefined;
559+clearInitialPreviewTimer();
516560lastSentPreviewKey = "";
517561if (options?.resetOffset !== false) {
518562deliveredTextOffset = 0;
@@ -526,6 +570,7 @@ export function createTelegramDraftStream(params: {
526570};
527571528572const clear = async () => {
573+clearInitialPreviewTimer();
529574const messageId = await takeMessageIdAfterStop({
530575 stopForClear,
531576readMessageId: () => streamMessageId,
@@ -544,6 +589,7 @@ export function createTelegramDraftStream(params: {
544589};
545590546591const discard = async () => {
592+clearInitialPreviewTimer();
547593await stopForClear();
548594};
549595此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。