MCPcopy
hub / github.com/CopilotKit/CopilotKit / EditStream

Class EditStream

packages/bot-telegram/src/chunked-edit-stream.ts:60–129  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

58}
59
60class EditStream {
61 private buffer = "";
62 private posted = "";
63 private queue: Promise<void> = Promise.resolve();
64 private lastFlushedAt = 0;
65 private flushTimer: ReturnType<typeof setTimeout> | undefined;
66 private readonly minIntervalMs: number;
67 private readonly update: (text: string) => Promise<void>;
68 /** Non-null when the terminal flush (from finish()) failed. */
69 private terminalError: unknown = undefined;
70
71 constructor(config: EditStreamConfig) {
72 this.update = config.update;
73 this.minIntervalMs = config.minIntervalMs;
74 }
75
76 append(text: string): void {
77 if (text === this.buffer) return;
78 this.buffer = text;
79 this.scheduleFlush();
80 }
81
82 async finish(): Promise<void> {
83 if (this.flushTimer) {
84 clearTimeout(this.flushTimer);
85 this.flushTimer = undefined;
86 }
87 this.enqueueFlush(/* terminal */ true);
88 await this.queue;
89 if (this.terminalError !== undefined) {
90 throw this.terminalError;
91 }
92 }
93
94 private scheduleFlush(): void {
95 if (this.flushTimer) return;
96 const elapsed = Date.now() - this.lastFlushedAt;
97 const delay = Math.max(0, this.minIntervalMs - elapsed);
98 this.flushTimer = setTimeout(() => {
99 this.flushTimer = undefined;
100 this.enqueueFlush(false);
101 }, delay);
102 }
103
104 private enqueueFlush(terminal: boolean): void {
105 this.queue = this.queue.then(() => this.flushNow(terminal));
106 }
107
108 private async flushNow(terminal: boolean): Promise<void> {
109 if (this.buffer === this.posted) return;
110 const text = this.buffer;
111 try {
112 await this.update(text);
113 // Only advance posted after a successful edit so a transient failure
114 // leaves the text eligible for retry on the next flush.
115 this.posted = text;
116 } catch (err) {
117 if (terminal) {

Callers

nothing calls this directly

Calls 1

resolveMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…